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
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
2k
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
2026-08-05 IBM Z開発最前線!IBM Bob Premium Package for Zって何がすごいの?
yutanonaka
0
330
TypeScript入門 2026
recruitengineers
PRO
3
700
【CEDEC2026】Creative Approaches to Localizing the Dialects and Unique Speech of Umamusume: Pretty Derby Characters in English
cygames
PRO
3
25k
モノリス Rails でも日中に rails db:migrate を走らせたい! / Daytime rails db:migrate on Monolithic Rails!
euglena1215
4
640
強化学習「理論」入門
enakai00
3
3.6k
LanceDB入門
mocobeta
9
600
Reference-Free Image Quality Assessment for Virtual Try-On via Human Feedback
zozotech
PRO
0
640
20260807_第6回_関東kaggler会LT_claw系bot xangiと始める、"寂しくない" kaggle
sugupoko
0
360
LLM・AIエージェントシステムベストプラクティス
shibuiwilliam
6
1.5k
Bits AI を制するものは Datadog を制す / The player that controls Bits AI, controls Datadog
kaminashi
0
130
エンドユーザー視点で見る SansanのMeraki活用と内製自動化
sansantech
PRO
0
120
社内の7割が使うデータ基盤を、 データチーム2人で回すためにやったこと
koh_yoshi
4
1.5k
Featured
See All Featured
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
470
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.5k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
56k
Practical Orchestrator
shlominoach
191
12k
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
650
Designing for Timeless Needs
cassininazir
1
450
Designing Powerful Visuals for Engaging Learning
tmiket
1
500
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
Being A Developer After 40
akosma
91
590k
30 Presentation Tips
portentint
PRO
1
370
RailsConf 2023
tenderlove
30
1.5k
Building Flexible Design Systems
yeseniaperezcruz
330
40k
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 Λ࣮ͯ͠ΩϟογϡΛߋ৽ͤ͞Δඞཁ͕͋Δ • ΩϟογϡΛҙࣝ͢Δ͜ͱͰύϑΥʔϚϯεΛ্ͤ͞Δ͜ͱ͕Ͱ͖Δ