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.8k
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
390
Other Decks in Programming
See All in Programming
Google Apps Script で Ruby を動かす
kawahara
0
120
「寝てても仕事が進む」Claude Codeで組む第二の脳
tomoyafujita2016
0
230
Welcome to the "Parametricity" 🏙️ − Generic だけど Specific な世界 −
guvalif
PRO
1
190
為什麼你並不需要ViewModel / No, you don't need a ViewModel
lovee
1
450
【やさしく解説 設計編・中級 #4】ルールの寿命と、システムの年輪
panda728
PRO
2
180
生成AIで帳票OCRが「簡単に」作れる時代になった?
kon_shou
0
120
PHP Application における Kubernetes 内 gRPC 通信
ganchiku
0
570
php-fpmのプロセスが枯渇した日-調査・対処・そして本当にやるべきだったこと-
shibuchaaaan
0
180
改善しないと、タスクが回らない。 “てんこ盛りポジション” を引き継いだ情シスの、入社3ヶ月の業務改善録
krm963
0
230
人間の目はかわらない、だからJPEGは30年もつ
yuzneri
12
17k
使いながら育てる Claude Code — 開発フローの1コマンド化 × 繰り返し指摘の自動仕組み化
shiki_kakaku
0
1.4k
GDG Korea Android: 2026 I/O Extended ~ What's new in Android development tools
pluu
0
200
Featured
See All Featured
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
600
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
330
Marketing to machines
jonoalderson
1
5.6k
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
62
45k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
Navigating Team Friction
lara
192
16k
Navigating Weather and Climate Data
rabernat
0
430
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.2k
Claude Code のすすめ
schroneko
67
230k
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.1k
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
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 !