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
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.9k
App Router 悲喜交々
quramy
8
750
上手に付き合うコンポーネントテスト
quramy
6
2.4k
Patched fetch did not work
quramy
6
800
Next.js App Router
quramy
15
3.9k
Fragment Composition of GraphQL
quramy
17
4.9k
reg-viz VRT tools
quramy
4
1.7k
NoInfer
quramy
0
400
Other Decks in Programming
See All in Programming
わからない話を追いかけたら、プログラミング言語を作る側にいた
ydah
3
520
PostgreSQL 18で考えるUUID主キー
kazuhiro1982
0
470
jsmini JavaScript Engine を作ってみた話
yosuke_furukawa
PRO
0
320
仕様駆動開発の消費期限
watany
20
8.5k
GDG Korea Android: 2026 I/O Extended ~ What's new in Android development tools
pluu
0
230
ここ半年くらいでAIに作らせたR用ツール
eitsupi
0
380
Built Our Own Background Agent at LayerX
layerx
PRO
10
5.6k
自動化したのに回らないテスト運用の壁ーAI時代の品質責任と生産性
mfunaki
1
140
<title><a id="</title>君はこのHTMLをパースできるか"></a></title> #雑LT_study
pizzacat83
0
150
Claude CodeとAgentCore Gatewayを繋ぐ際の認証認可 / Authentication and authorization when connecting Claude Code with AgentCore Gateway
har1101
2
290
【やさしく解説 設計編・中級 #6】良いアーキテクチャとは ~ 一本の登り道の、行き先 ~
panda728
PRO
0
220
「寝てても仕事が進む」Claude Codeで組む第二の脳
tomoyafujita2016
0
340
Featured
See All Featured
GraphQLの誤解/rethinking-graphql
sonatard
75
12k
A Modern Web Designer's Workflow
chriscoyier
698
190k
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
490
Accessibility Awareness
sabderemane
1
180
Being A Developer After 40
akosma
91
590k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
280
How to Think Like a Performance Engineer
csswizardry
28
2.7k
Fireside Chat
paigeccino
42
4k
It's Worth the Effort
3n
188
29k
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
1
400
Visualization
eitanlees
152
17k
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 !