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
JSConf JP 2022 introduce React Query
Search
South
November 26, 2022
Programming
7.4k
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
JSConf JP 2022 introduce React Query
South
November 26, 2022
More Decks by South
See All by South
Automating Web Accessibility Testing with AI Agents
maminami373
1
2k
TSConfig Solution Style & subpath imports to switch types on a per-file basis
maminami373
2
340
Front-end rearchitect SPA
maminami373
0
560
JSConf jp 2021 kaonavi front-end development in the monolithic service
maminami373
1
260
単体テストゼロからテスト文化を醸成させた話 / Fostering the testing culture
maminami373
0
2.5k
Other Decks in Programming
See All in Programming
AIキャラアプリkaiwaの低遅延音声通話基盤をどう作ったか - AWS Gravitonで支える低遅延・低コストAI Agent基盤
mogamit
0
180
AIエージェントで 変わるAndroid開発環境
takahirom
2
690
yield再入門 #phpcon
o0h
PRO
0
700
作るコストが小さくなった時代 幸せに働くために改めて考えたいこと 〜エンジニアとして価値を出し続けるために注視している二分野〜
yuppeeng
0
120
琵琶湖の水は止められてもNet--HTTPのリトライは止められない / You might be able to stop the water flow of Lake Biwa but you can't stop Net::HTTP retries
luccafort
PRO
0
420
エンジニア向け会社紹介/Findy Company Profile
findyinc
6
360k
JAWS-UG横浜 #102 AWSサ終供養LT会 成仏できない AWS サービスたち 〜本日、三体供養します〜
maroon1st
0
220
AWS CDK を「作」ってみた 〜フルスクラッチで見えた CDK の裏側〜 / aws-cdk-from-scratch
gotok365
3
480
【SRE NEXT 2026 Lunch Session】一人目専任SREの立ち上げを加速する ― AIと進めたオンボーディングで2分を0.04秒にした話
pkshadeck
PRO
0
2.9k
Haskell/Servantを通してWebミドルウェアを捉え直す
pizzacat83
1
600
「正の参照」と 「負の導出」で組む ハーネスエンジニアリング
cottpan
1
150
AI 輔助遺留系統現代化的經驗分享
jame2408
1
1.2k
Featured
See All Featured
Unsuck your backbone
ammeep
672
58k
Six Lessons from altMBA
skipperchong
29
4.3k
Deep Space Network (abreviated)
tonyrice
0
230
How GitHub (no longer) Works
holman
316
150k
Marketing to machines
jonoalderson
1
5.6k
How to make the Groovebox
asonas
2
2.3k
ラッコキーワード サービス紹介資料
rakko
1
4M
AI: The stuff that nobody shows you
jnunemaker
PRO
9
840
Fashionably flexible responsive web design (full day workshop)
malarkey
408
67k
Building a Modern Day E-commerce SEO Strategy
aleyda
45
9.1k
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
390
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.4k
Transcript
React Query 導入と 実装ルールについて考える 2022.11.26 JSConf JP 2022 | 株式会社カオナビ
Yuuki Minami © kaonavi, inc.
© kaonavi, inc. 2 • Yuuki Minami • CTO 室
フロントエンド支援チーム • 🍜🍺❤
React Query の導入時に得られた知見や 実装について考えたこと 話すこと © kaonavi, inc. 3
INDEX 1 .React Query について 2 .React Query 導入と選定 3
.実装ルール・実装例 4 .React Query の近時 © kaonavi, inc. 4 5 .まとめ
React Query について © kaonavi, inc. 5
React Query (TanStack Query) © kaonavi, inc. 6 • 非同期状態管理ライブラリ
◦ データ取得 ◦ サーバーデータ (API レスポンス) のキャッシュ • v4 から TanStack Query へ名称変更 ◦ React, Solid, Vue に対応 (2022年11月時点)
React Query の特徴 © kaonavi, inc. 7 • stale-while-revalidate キャッシュ戦略
• 同一データ取得リクエストの重複削除 • garbage collection の設定 • structural sharing による Query 結果のメモ化 • バックグラウンドでのデータ更新 • Suspense モード
useQuery Component がレンダリングされるとキャッシュが有効であれ ばキャッシュされたデータを返し、キャッシュが存在しない場 合やキャッシュの状態が Stale の時はデータをフェッチする。 • queryKey: キャッシュ管理のための
一意なキー • queryFn: データ取得のための Promise を返す関数 基本的な使い方 © kaonavi, inc. 8
React Query 導入と選定 © kaonavi, inc. 9
• 一部のページで MPA -> SPA へ移行 • 歴史的背景 ◦ Redux
Store がページ毎に存在 (Not single store) • SPA で Redux 以外の Global State 共有のアプローチが必要 • SPA 化によりキャッシュ活用の機運が高まる • Redux 実装が肥大化しがちでつらい 導入のモチベーション © kaonavi, inc. 10
• React Query ◦ 自動 garbage collection 👍 ◦ 公式
Devtools 👍 ◦ 開発の勢いとリリースサイクルの早さ 👍 • SWR ◦ シンプル・必要最低限の機能はある ◦ サイズが小さい • RTK Query ◦ 歴史的背景から Redux (RTK) がシングルストアではない ◦ Redux にロックイン 他の候補との比較と導入の決め手 © kaonavi, inc. 11
Stale Time • Query を fresh から stale へ移行す るまでの時間
• fresh の間はデータは常にキャッシュ から取得され、リクエストが走ることは ない • stale の場合、キャッシュを返しつつ バックグラウンドで再取得とデータ更 新が可能 React Query Concepts © kaonavi, inc. 12 • 非アクティブな Query のキャッシュを 削除 (GC) するまでの時間 • Observer (その Query を利用するコ ンポーネント) が全て unmount される と Query は非アクティブに移行 Cache Time © kaonavi, inc. 12
React Query Devtools • Query 毎にキャッシュされているデータが確 認可能 • Query の状態が把握でき、ボタンからデータ
の再取得やキャッシュの破棄も可能 • オプトインなので利用する際は本体と別にイ ンストール • development build でのみ有効化される
TanStack/query 開発とリリース © kaonavi, inc. 14 https://github.com/TanStack/query/pulse/monthly © kaonavi, inc.
14
TanStack/query 開発とリリース https://www.npmjs.com/package/@tanstack/react-query?activeTab=versions © kaonavi, inc. • Opened issues: 18
(資料作成時点) • Feature Requests & Questions は Discussions • Issue の修正が早い • リリース頻度が高い ので修正がマージされたらす ぐに取り込める 15
Comparison Matrix © kaonavi, inc. 16 https://tanstack.com/query/v4/docs/comparison
Redux は不要になるか? © kaonavi, inc. 17 • API レスポンス以外の Global
State を React Context 等に寄せることで場合によっては不要 ◦ Context でレンダリングを最適化するには Context を適宜分割し、複数の Provider を用意 する必要がある • 複雑な要件に対応させるために API レスポンス以外にも様々な Global State を管理 • レンダリング最適化や可読性の観点から、 Redux は引き続き有用と考える
実装ルール・実装例 © kaonavi, inc. 18
Custom Hooks © kaonavi, inc. 19 • Query 毎に Custom
Hooks で抽象化し、可搬性・ 保守性の向上 • Component から直接 useQuery を呼ばない • コアメンテナ Dominik 氏のブログでも推奨 ◦ https://tkdodo.eu/blog/practical-react-query ※v5では useQuery の引数は単一のオブジェクトのみ許容に
Query Keys © kaonavi, inc. 20 • 一意性を担保するためにルールを設定 • common
or features ◦ common: 省略 ◦ features: feature 名を含める • Hooks name ◦ useFoo の foo を含める • Custom Hooks ファイル内で定義 ◦ 利用する Query Keys を間違えない ◦ コンフリクトしない
useQuery options type • useQuery に options を渡すことが可能 • Custom
Hooks の引数で options を受け取る • select option による取得データの加工 ◦ select で取得されるデータに変更があっ た場合のみ再レンダリング ◦ 型推論させるために工夫が必要 ◦ 最適解求む! © kaonavi, inc. 21
React Query の近時 © kaonavi, inc. 22
ESLint Plugin © kaonavi, inc. 23 • v4.14.0で追加 • @tanstack/query/exhaustive-deps
◦ queryFn 内で利用するパラメータは queryKey に指 定する • @tanstack/query/prefer-query-object-syntax ◦ useQuery の引数は単一のオブジェクトのみ許容
suspense for useQueries © kaonavi, inc. 24 • v4.15.0で useQueries
が suspense モードに対 応 (experimental とのこと) • 全ての Query の取得が完了するまでコンポー ネントツリーはマウントせずに fallback • Issue が報告されてから約 2年越しに解決 🎉 • 通常の useQuery の suspense モードでは ウォーターフォール的にしか実行できない
• useQuery の引数は単一のオブジェクトのみ許容 • require React >=18.2.0 • require TypeScript
>=4.7 • rename cacheTime to gcTime • rename useErrorBoundary to throwError • Optional chaining のトランスパイル廃止によるバンドルサイズ改善 v5 Roadmap © kaonavi, inc. 25 現在ドラフト https://github.com/TanStack/query/discussions/4252
まとめ © kaonavi, inc. 26
まとめ © kaonavi, inc. 27 • React Query はプロダクトで活躍できるポテンシャルがある ◦
痒いところに手が届く API や Options ◦ Devtools や ESLint Plugin による開発者体験 ◦ 開発の勢い • 実装のルールはしっかり考えないと破綻する可能性あり (特に Query Keys) • Stale Time と Cache Time の概念だけ最初は少々戸惑いがち ◦ 実際に手元で動かして理解するのが一番 • 開発が早く、検索した情報が古くなっている可能性があるので公式ドキュメントと照らし合 わせる