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
Apollo Client Cache
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
kobayang
October 10, 2019
Technology
1.3k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Apollo Client Cache
kobayang
October 10, 2019
More Decks by kobayang
See All by kobayang
React Suspenseを使って遷移体験を向上させる
kobayang
4
2.1k
React Hooks を安全に使う
kobayang
2
1.4k
Puppeteerを導入してみた話
kobayang
2
150k
ゼロから学ぶWeb Authentication API
kobayang
0
1.3k
react-beautiful-dnd を使いたかった話
kobayang
2
2k
Other Decks in Technology
See All in Technology
最新技術に積極チャレンジ!EKS共通基盤のこれまでとこれから
daitak
0
290
Sony-DroidKaigi2026
sony
1
290
現場の暗黙知を継承するAIエージェント — 対話から生まれる長期記憶と Skills
atsukish
0
220
なぜSRE・セキュリティは評価されないのか?守りの組織を事業成長エンジンに変えた実践
cscengineer
PRO
1
1.5k
AI-DLCって実際どう? 〜聞きたいこと全部聞いてみる〜
news_it_enj
0
170
本番に近いテストをもっと手軽に - Postmanで広がるAPIテストの世界 / Expanding the World of API Testing with Postman
yokawasa
1
220
全員がプロダクトへ向き合う組織を持続成長させるために——組織づくりのフライホイールと4象限 / The Flywheel Model and Four Quadrants for Organizational Design
hiro_torii
2
410
[RSJ26] Building a VLA Model Based on Self-Distilled Classification
keio_smilab
PRO
0
170
DGX Sparkを2台使って いろいろ動かす話
sonoda_mj
1
120
Claude Codeで開発以外の業務も爆速化しよう!
minorun365
PRO
12
9.5k
20260906 「AWS運用入門」著者が教える、運用業務への生成AI活用入門
masaruogura
0
150
Webとヘルスデータ
yukukotani
0
130
Featured
See All Featured
A Tale of Four Properties
chriscoyier
163
24k
Designing for humans not robots
tammielis
254
26k
Documentation Writing (for coders)
carmenintech
77
5.5k
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
Side Projects
sachag
455
43k
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
220
Facilitating Awesome Meetings
lara
57
7.1k
It's Worth the Effort
3n
188
29k
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
68
57k
Context Engineering - Making Every Token Count
addyosmani
9
1.1k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.3k
How to make the Groovebox
asonas
2
2.4k
Transcript
©2018 Wantedly, Inc. Apollo Client Cache meguro.es 2019.10.10 - Naoki
Kobayashi
©2018 Wantedly, Inc. Naoki Kobayashi GitHub: @kobayang Twitter: @kbys_02 I’m
an Frontend Engineer @Wantedly
©2018 Wantedly, Inc. https://blog.apollographql.com/introducing-the-apollo-graphql-platform-8ef34bb269e5 cache
©2018 Wantedly, Inc. { Declare GraphQL Query Use Query to
fetch data const TodoContainer = () => { const { data, loading, error } = useQuery(todosQuery); const todos = data ? data.todos : []; } const todosQuery = gql` query TodosQuery { todos { id title } } `;
©2018 Wantedly, Inc. Agenda • Apollo Client ͷ Cache ͍ͭߦΘΕΔ͔
• ͲͷΑ͏ʹCacheͷߋ৽Λߦ͏͔ • ͲΜͳσʔλ͕Cacheʹೖ͍ͬͯΔ͔ • Cacheͷߋ৽ͷ࠷దԽ
©2018 Wantedly, Inc. Fetch Data Flow User Interface Fetch Cache
3FRVFTUUP UIFTFSWFS .PVOUPSVTFSBDUJPO USJHHFSTGFUDI Apollo Server 3FBEDBDIF
©2018 Wantedly, Inc. Prefetching Data https://www.apollographql.com/docs/react/performance/performance/ onMouseOver Ͱ query ΛಡࠐΉ
LinkઌͰಉ͡ΫΤϦΛಡࠐΉͱ Cache͕ώοτ͢ΔͨΊɺ Loadingͳ͠ͰData͕͑Δ
©2018 Wantedly, Inc. Local State Management https://www.apollographql.com/docs/react/performance/performance/ • CacheΛར༻ͯ͠LocalͷStateΛѻ͑Δ •
@client directive Λ Query/Mutation ʹ ͚ͭΔ͜ͱͰऔಘઌ͕ϩʔΧϧʹͳΔ # local-schema.grpahql extend type Todo { done: Boolean! } // apollo.ts const resolvers: Resolvers = { Todo: { done(todo: TodoFragment) { return todo.done || false; }, }, }; const todoFragment = gql` fragment TodoFragment on Todo { id title done @client } `;
©2018 Wantedly, Inc. InMemoryCache https://medium.com/expedia-group-tech/creating-your-own-apollo-cache-for-perf-and-profit-8f786849e5f6 • ApolloClientͷΩϟογϡͷσϑΥϧτ࣮ • Ωϟογϡ͢ΔࡍʹσʔλΛਖ਼نԽ͢Δ(Normalize)
©2018 Wantedly, Inc. Mutation Data Flow User Interface Mutation Apollo
Server Cache 3FRVFTUUPUIFTFSWFS VTFSBDUJPO USJHHFSTNVUBUJPO 4UPSFDIBOHFT ESJWFT6*
©2018 Wantedly, Inc. Mutation Data Flow User Interface Mutation Apollo
Server Cache 3FRVFTUUPUIFTFSWFS VTFSBDUJPO USJHHFSTNVUBUJPO 4UPSFDIBOHFT ESJWFT6* ࣮͢Δඞཁ͕͋Δ
©2018 Wantedly, Inc. ྫ: TodoͷՃ BEE5PEP.VUBUJPO UPEPT2VFSZ const todosQuery =
gql` query TodosQuery { todos { id title } } `;
©2018 Wantedly, Inc. ྫ: refetchQueries const addTodoMutation = gql` mutation
AddTodoMutation($title: String!) { addTodo(title: $title) { id title } } `; const [addTodo] = useMutation(addTodoMutation, { refetchQueries: [{ query: todosQuery }], }); Cache 3FGFUDI 4FSWFS3FTQPOTF
©2018 Wantedly, Inc. ྫ: update const [addTodo] = useMutation(addTodoMutation, {
update: (cache, { data }) => { const cachedQuery = cache.readQuery({ query: todosQuery }); if (!cachedQuery || !data) { throw new Error(); } const todos = cachedQuery.todos; cache.writeQuery({ query: todosQuery, data: { todos: todos.concat([data.addTodo]) }, }); }, }); 4FSWFS3FTQPOTF Cache
©2018 Wantedly, Inc. ΩϟογϡΛ͍ͯΈΔ Apollo Client Developer Tools: ΩϟογϡͷதΛ֬ೝͰ͖Δ
©2018 Wantedly, Inc. dataIdFromObject https://github.com/apollographql/apollo-client/blob/22a450aace/packages/apollo-cache-inmemory/src/inMemoryCache.ts
©2018 Wantedly, Inc. readFragment const data = client.readFragment<TodoFragment>({ id: "Todo:1",
fragment: todoFragment, }); console.log(data); // => { id: 1, title: "ൃදࢿྉΛ࡞Δ", __typename: "Todo" }
©2018 Wantedly, Inc. id͕ͳ͍߹ • ROOT_QUERY.todos.0 ͷΑ͏ʹ ROOT_QUERY ʹඥ͍ͮͯΩϟογϡ͞ΕΔ
const todosQuery = gql` query TodosQuery { todos { title } } `;
©2018 Wantedly, Inc. id͕ͳ͍߹ • ࣮readFragmentͰऔಘͰ͖Δ const data = client.readFragment<TodoFragment>({
id: “ROOT_QUERY.todos.0”, fragment: todoFragment, }); console.log(data); // => { title: "ൃදࢿྉΛ࡞Δ", __typename: "Todo" }
©2018 Wantedly, Inc. Mutation Data Flowʢ࠶ܝʣ User Interface Mutation Apollo
Server Cache 3FRVFTUUPUIFTFSWFS VTFSBDUJPO USJHHFSTNVUBUJPO 4UPSFDIBOHFT ESJWFT6*
©2018 Wantedly, Inc. Optimistic Response Mutation Apollo Server Cache User
Interface Optimistic Response
©2018 Wantedly, Inc. Optimistic Response Mutation ͷҾʹՃ optimisticResponse: vars =>
({ addTodo: { id: "-1", title: vars.title, __typename: "Todo", }, }), update: (cache, { data }) => { console.log("update", data); //… } updatemutation࣮ߦ࣌ͱߋ৽࣌ʹ 2ճݺΕΔ
©2018 Wantedly, Inc. Optimistic Response ApolloCache removeOptimistic Ͱ optimisticResponseͷΩϟογϡআ͞ΕΔ https://github.com/apollographql/apollo-client/blob/22a450aace/packages/apollo-cache-inmemory/src/inMemoryCache.ts#L251
©2018 Wantedly, Inc. ·ͱΊ • Apollo ClientʹΩϟογϡͷΈ͕͋Γ Fetchͨ͠σʔλΛਖ਼نԽͯ͠Ωϟογϡ͍ͯ͠Δ • Mutation࣌ɺঢ়گʹ߹Θͤͯ
refetchQueries, update, optimisticResponse Λ࣮ͯ͠ΩϟογϡΛߋ৽ͤ͞Δඞཁ͕͋Δ • ΩϟογϡΛҙࣝ͢Δ͜ͱͰύϑΥʔϚϯεΛ্ͤ͞Δ͜ͱ͕Ͱ͖Δ