Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
GraphQL あるいは React における自律的なデータ取得について
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Yosuke Kurami
September 10, 2024
Programming
5.9k
18
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
GraphQL あるいは React における自律的なデータ取得について
Yosuke Kurami
September 10, 2024
More Decks by Yosuke Kurami
See All by Yosuke Kurami
TypeScript LSP の今までとこれから
quramy
1
2.1k
フロントエンドテストの育て方
quramy
12
3.8k
App Router 悲喜交々
quramy
8
740
上手に付き合うコンポーネントテスト
quramy
6
2.4k
Patched fetch did not work
quramy
6
790
Next.js App Router
quramy
15
3.9k
Fragment Composition of GraphQL
quramy
17
4.8k
reg-viz VRT tools
quramy
4
1.7k
NoInfer
quramy
0
390
Other Decks in Programming
See All in Programming
【やさしく解説 設計編 #0】DDDのコード、読めるのに分からない人へ
panda728
PRO
2
280
Welcome to the "Parametricity" 🏙️ − Generic だけど Specific な世界 −
guvalif
PRO
1
180
Apache Hive: Toward a Cloud Native Lakehouse
okumin
0
160
全PRの83%がAIレビューだけでマージできるようになった開発組織はその後どうなったか
athug
0
310
Laravel Boostに学ぶ、AIにPHPを書かせる技術 〜OSSの実装から蒸留するエージェント制御の王道〜
kentaroutakeda
3
520
ITヒヤリハットを整理してみた ~ライフサイクルと原因から考える再発防止策~
koukimiura
1
110
作るコストが小さくなった時代 幸せに働くために改めて考えたいこと 〜エンジニアとして価値を出し続けるために注視している二分野〜
yuppeeng
0
120
【やさしく解説 設計編 #1】「ドメイン駆動」と「実装駆動」ってなに? 〜設計の考え方を、たとえ話で学ぼう〜
panda728
PRO
1
120
ソフトウェア設計に溶けるインフラ ― AWS CDK のインフラ認識論
konokenj
2
630
使用 Meilisearch 建立新聞搜尋工具
johnroyer
0
170
「正の参照」と 「負の導出」で組む ハーネスエンジニアリング
cottpan
1
150
Claude Opus 4.6以後の受託開発エンジニアの変化(Claude Code開発ノウハウ大公開スペシャルbyクラスメソッド)
iidatakuma
1
850
Featured
See All Featured
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
910
The Limits of Empathy - UXLibs8
cassininazir
1
530
sira's awesome portfolio website redesign presentation
elsirapls
0
310
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
Java REST API Framework Comparison - PWX 2021
mraible
34
9.5k
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.4k
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
1
370
Building Applications with DynamoDB
mza
96
7.1k
Thoughts on Productivity
jonyablonski
76
5.3k
Prompt Engineering for Job Search
mfonobong
0
380
GraphQLの誤解/rethinking-graphql
sonatard
75
12k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
Transcript
GraphQL ͋Δ͍ React ʹ͓͚Δ ࣗతͳσʔλऔಘʹ͍ͭͯ @Quramy 2024.9.10
About me - id: @Quramy (GitHub, X) - ৬छ: Web
ϑϩϯτΤϯυΤϯδχΞ - Quramy ͱ Query ͷؔ - GraphQL ͷܦݧ: ຊ൪ͰܞΘΔΑ͏ʹͳͬͯ5 ~ 6 - Ұ࣌ظ GraphQL Server Side Λ͍ͬͯͨ͜ͱ͋Γ·͕͢ɺ جຊ React ʹΑΔΫϥΠΞϯταΠυͷ։ൃ͕ϝΠϯ - झຯͰ ts-graphql-plugin ͱ͍͏πʔϧΛϝϯς͍ͯ͠·͢ (ͬͪ͜ 7͘Β͍) https://github.com/Quramy/ts-graphql-plugin
ࠓ͢͜ͱ - ϑϩϯτΤϯυʹͱͬͯɺͳͥ GarphQL ͕͋Γ͕͍ͨͷ͔ - React Server Components ͱ
GraphQL ͷؔʹ͍ͭͯ
σʔλϑΣονͷ՝
Data fetch on "Leaf" 1PTU$PNQPOFOUͷσʔλղܾ͕ऴΘΔ·Ͱ"VUIPS$PNQPOFOUʹඞཁ ͳσʔλͷϦΫΤετ͕ߦΘΕͳ͍ʢ͍ΘΏΔΥʔλʔϑΥʔϧʣ ˠύϑΥʔϚϯε͕ѱ͍
Data fetch on "Root" ίϯϙʔωϯτʹඞཁͳσʔλͷཧओମ͕ 3PPUͱͳΔ ࣗతͰͳ͍ σʔλදࣔ༰ͷมߋͷͨͼʹίϯϙʔωϯτ πϦʔશମʹվम͕ٴͿ
ˠอकੑ͕͍
σʔλϑΣονʹ͓͚Δ՝ 3PPUͰσʔλϑΣον -FBGͰσʔλϑΣον 1FSGPSNBODF ✅ 🤮 %FWFMPQFS&YQFSJFODF 🤮 ✅
GraphQL ʹΑΔղ
σʔλϑΣονʹ͓͚Δ՝ GraphQL / Relay ͜ΕΛղফ͢ΔͨΊʹچ Facebook ࣾʹΑͬͯ࡞ΒΕͨ ※ ҎԼ React
Europe 2015 ʹ͓͚ΔͦΕͧΕͷհಈը • Lee Byron ࢯͷ GraphQL հಈը: https://www.youtube.com/watch?v=WQLzZf34FJ8 • Joe Savona ࢯͷ Relay հಈը: https://www.youtube.com/watch?v=IrgHurBjQbg 3PPUͰσʔλϑΣον -FBGͰσʔλϑΣον 1FSGPSNBODF ✅ 🤮 %FWFMPQFS&YQFSJFODF 🤮 ✅
GraphQL ͷֶ - Client / Server ͱʹ Leaf ʹॲཧΛهड़͢Δ ݴ͍͑Δͱɺ֤Ϟδϡʔϧ͕ࣗత.
Fat Controller Fat Component ͕ੜ·Εʹ͍͘ - Client: Leaf Ͱએݴ(fragment), Root(Query) ·ͱΊ্͛Δ͚ͩ - Server: ϑΟʔϧυϦκϧόʮ͕ࣗࣗԿΛฦ͔͢ʯ͚ͩΛҙࣝ͢Ε Α͍ - Leaf <-> Root ͷΓͱΓϑϨʔϜϫʔΫʹͤΔ
Data fetch w/ GraphQL $PNQPOFOU͕ࣗʹඞཁͳσʔλΛ3FTPMWFSʹཁٻ͍ͯ͠Δ ௨৴Λ·ͱΊ্͛Δɾ͢ΔͷϑϨʔϜϫʔΫ͕ͬͯ͘ΕΔ
GraphQL ସͱͯ͠ͷ React Server Components
React Server Components (RSC) ͕ղܾ͍ͨ͠ - 2020ͷ RSC ൃද࣌ʹʮReact ʹ͓͚Δ
Data Fetch ͷෛΛɺGraphQL / Relay Λར༻ͤͣʹղফ͢Δखஈʯͱհ͞Ε͍ͯΔ - https://www.youtube.com/watch?v=TQQPAU21ZUw
RSC ͱ - ʮαʔόʔͰͷΈಈ࡞͢Δʯ React ίϯϙʔωϯτ(Server Component; SC) ͕ര -
ैདྷͷ Server Side Rendering ϒϥβͰಈ࡞͢Δ React ίϯϙʔ ωϯτΛʮαʔόʔͰಈ࡞͍ͤͯ͞Δʯ͚ͩ - Server Ͱ͔͠Ͱ͖ͳ͍͜ͱɺ͢ͳΘͪ σʔλղܾඇಉظIO Λ࣮ߦͰ͖ Δ - SC Ͱ "Leaf data fetch" ͕ Performance ্ͷτϨʔυΦϑͰͳ͘ ͳΔ
Data fetch on "Client" Leaf 1PTU$PNQPOFOUͷσʔλղܾ͕ऴΘΔ·Ͱ"VUIPS$PNQPOFOUʹඞཁ ͳσʔλͷϦΫΤετ͕ߦΘΕͳ͍ʢ͍ΘΏΔΥʔλʔϑΥʔϧʣ ˠύϑΥʔϚϯε͕ѱ͍ ͜ͷΥʔλʔϑΥʔϧ͕ͱͳΔͷɺ $PNQPOFOU
$MJFOU 4FSWFSͷ௨৴͕Π ϯλʔωοτ ߴԆ/8 ΛލΔͨΊ
Data fetch on "Server" Leaf $PNQPOFOU͕4FSWFS4JEF σʔλιʔεͷۙ͘ Ͱಈ࡞͢ΔͷͰ͋ ΕɺΥʔλʔϑΥʔϧͷԆେ͖ͳͰͳ͍ 4FSWFSଆͰඳըࡁΈͷ༰
FH1PTU $PNQPOFOU Λ࣮%0.ʹөͤ͞Δͷ 3FBDU͕ͬͯ͘ΕΔ
Server Component = Fragment Container + Resolver ~ Async Server
Component GraphQL Resolver ͕ Type Data Λฦ͢ΘΓʹɺServer Component ͕ ʮData + ඳը͞Εͨ UI ͷஅยʯΛฦ͢ GraphQL RSC
(SBQI2-3FTPMWFS ্ 4FSWFS$PNQPOFOU Լ ͕ࣗඞཁͱ͢ΔσʔλΛࣗͰղܾ͍ͯ͠Δ ࣗతͰ͋Δ
͜ͷߏͰ։ൃ͢ΔͨΊʹඞ ཁͳ͜ͱ - RSC ʹରԠ͍ͯ͠ΔϝλϑϨʔϜϫʔΫ: Next.js, Redwood, waku, etc... -
GraphQL Resolver ։ൃͷݟ - e.g. N + 1 ͷରԠύλʔϯ, Lazy Loading - GraphQL Sever Side ܦݧऀ͢ΜͳΓ RSC Λ࢝ΊΒΕΔͱࢥ͏
GraphQL ͱͷซ༻
[IMO] RSC + GraphQL Γͨ͘ ͳ͍ - ಉ͜͡ͱΛ࣮ݱ͢Δํ๏͕ࠞࡏ͍ͯ͠Δ͜ͱʹର͢Δسආײ - RSC
ͱ GraphQL ʹॏෳ͍ͯ͠Δཁૉ͕ଟ͍ ղܾ͠Α͏ͱ͕ͨ͠ʮΠϯλʔωοτӽ͠ͷޮతͳσʔλϑΣονʯͳͷͰવ - σʔλऔಘํ๏: Fragment colocation v.s. Fetching data on Leaf - Client Side Cache: Apollo Relay ͷ Store v.s. Next.js ͷ Cache (Router Cache) - Streaming: @defer Directive v.s. React Streaming SSR - RSC ͷཪʹ GraphQL Λஔ͍ͯࢫຯ͕ͳ͍ - RSC ΛΘͣʹɺGraphQL + Relay(or Apollo Client) ͳ SPA ߏͷํ͕·ͩγϯϓϧ
GraphQL or RSC (࠶ܝ) Πϯλʔωοτ ߴԆ/8 Λލ͍ͩ௨৴ʹରͯ͠ɺ ύϑΥʔϚϯεͱࣗੑΛཱ྆͢ΔͨΊ
RSC with GraphQL ...? Ԇ/8ͳαʔόʔڥͰ (SBQI2-Λͬͯࢫຯ͕ͳ͍
ͱݴ͏ͷͷ - ࠞͥΔͳͱݴ͍ͭͭʮݱߦࢿ࢈ͱͯ͠ͷ GraphQL αʔόʔ + ৽نͷϑϩϯτΤ ϯυʹ RSCʯͷંΓ߹͍ɺϢʔβʔϥϯυʹͱͬͯࠓޙͷ՝ -
GraphQL Λ RSC ্Ͱಈ͔͚ͩ͢ͳΒผʹ؆୯. ͪΌΜͱΔͷ͕͍ͣ͠ - e.g. Fragment colocation ͢Δɾ͠ͳ͍ΛϧʔϧܾΊ͢Δ - Relay RSC ౷߹ΛҰஅ೦͍ͯ͠Δ ※ fragment ͷ݁Ռ͕ RSC ϖΠϩʔυͱͳΔΑ͏ͳṖσΟϨΫςΟϒͳͲࢼߦࡨޡ͍ͯͨ͠෩Ͱ͋Δ͕ɺ ͍ͭͷ·ʹ͔ϨϙδτϦ͔Βআ͞Ε͍ͯͨ - Apollo ͷ https://github.com/apollographql/apollo-client-nextjs ৄࡉෆ໌ ※ ಈ࡞͢Δ͕ɺʮΞϓϦέʔγϣϯΛͲ͏࡞Δ͖͔ʯͱ͍͏ࢥ͕Θ͔Βͳ͍
͓ΘΓʹ
·ͱΊ̍ - GraphQL (+ Relay) ͱ React Server Component ɺΠϯλʔωοτӽ
͠ͷσʔλϑΣονʹ·ͭΘΔ (e.g. ΥʔλʔϑΥʔϧ) Λղܾ͢ Δ (ղܾํ๏͕ҟͳΔ͚ͩ) - ͲͪΒͰσʔλϑΣονΛޮΑࣗ͘తʹߦ͏ΞϓϦέʔγϣϯ͕ ࡞Մೳ - [IMO]ʮಉ͡՝ʹର͢Δํ๏ҧ͍ʯͰ͋ΔͨΊࠞͥΔϝϦοτ͕ͳ͍ɻ গͳ͘ͱɺॳखͰ GraphQL ͱ RSC ΛࠞͥΔબԿ͔͕͓͔͍͠
·ͱΊ̎ - ৽نʹ GraphQL Λ࠾༻͠Α͏ͱ͍ͯ͠Δਓ: ·ͣ RSC ͱ͍͏બࢶ͕͋Δ͜ͱΛͬͯ΄͍͠ - ͜Ε͔Β
RSC Λ͓͏ͱ͍ͯ͠Δਓ: Server Component ։ൃͱ GraphQL Resolver ։ൃྨࣅ͕ଟ͍ͷ ͰɺGraphQL ΤίγεςϜ͕ഓ͖ͬͯͨϊϋΛٵऩͯ͠ཉ͍͠
ࢀߟࢿྉ - GraphQL ͷ Fragment Colocation ʹ͍ͭͯͷ֓ཁ: https://speakerdeck.com/quramy/fragment-composition-of-graphql - RSC
(ಛʹ Next.js ʹ͓͚Δ) σʔλϑΣονͷ͋Γํ: https://zenn.dev/akfm/books/nextjs-basic-principle/viewer/part_1 - GraphQL ͱ RSC ͷྨࣅؔʹ͍ͭͯ (ίʔυྫؚΉ): https://quramy.medium.com/react-server-components-ͱ-graphql-ͷΞ φϩδʔ-89b3f5f41a01
Thank you !