Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
GraphQL あるいは React における自律的なデータ取得について
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Yosuke Kurami
September 10, 2024
Programming
6k
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.2k
フロントエンドテストの育て方
quramy
12
3.9k
App Router 悲喜交々
quramy
8
760
上手に付き合うコンポーネントテスト
quramy
6
2.4k
Patched fetch did not work
quramy
6
810
Next.js App Router
quramy
15
4k
Fragment Composition of GraphQL
quramy
17
4.9k
reg-viz VRT tools
quramy
4
1.8k
NoInfer
quramy
0
410
Other Decks in Programming
See All in Programming
Intent as Code
shoppingjaws
6
1.1k
新卒PdEのリアル
ryu1013
1
510
Security issues being discussed on Web Platforms
petamoriken
0
1.2k
Go × SIMDで高速化するベクトル検索 ~ルーフラインモデルでSIMDが効く境界を探れ! ~
po3rin
1
2.8k
thread_parallel_with_free-threaded_Python_and_NumPy.pdf
riku_sakamoto
0
350
TiDB Cloudのカスタムコントローラーによるオートスケール対応
takaidohigasi
0
130
標準パッケージに uuid が追加された 背景から見る Go らしい意思決定 / go_127_uuid_decision
convto
5
8.2k
そのリトライ、死んだコネクションを使い回していませんか ── GoのHTTPクライアントとHTTP/2を実プロダクト障害から学び直す
myus4a
0
220
AI が書く Go コードの品質を劇的に向上させる Linter: “declscope”
mpyw
0
380
MVNOの申込からeSIM開通までをiOSアプリでつなぐ- 本人確認・MNP・通信事業者基盤をまたぐ実装
satotakeshi
0
460
wkhtmltopdfの次どうするか問題2026
willnet
2
1.6k
AWS Step Functions 大規模並列の壁を越える / jaws-sonic-2026-niigata-step-functions
kasacchiful
PRO
1
510
Featured
See All Featured
Bootstrapping a Software Product
garrettdimon
PRO
306
120k
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
1
6.2k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.6k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
18k
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
530
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
940
Deep Space Network (abreviated)
tonyrice
0
320
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
Mind Mapping
helmedeiros
1
370
30 Presentation Tips
portentint
PRO
1
400
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.8k
Typedesign – Prime Four
hannesfritz
42
3.2k
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 !