react-query-best-practices について
React Query v4 の開発者向け実践ガイドです。クエリ、ミューテーション、キャッシュ、WebSocket、TypeScript、テスト、移行のルールを重要度順に整理し、説明とコード例へのリンクを備えています。
主な機能
- 01クエリキーとクエリ設計を網羅
- 02ミューテーション、キャッシュ更新、楽観的更新を解説
- 03キャッシュ戦略と WebSocket 連携を説明
- 04TypeScript とテストの指針を提示
- 05React Query v5 への移行点を整理
活用シーン
- 01一貫したクエリキーと依存関係の設計
- 02ミューテーション後のキャッシュ無効化
- 03WebSocket とクエリキャッシュの問題調査
- 04v4 から v5 への移行計画
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ arraydude/ agent-skills --skill react-query-best-practicesインストール後、Claude Code で/react-query-best-practicesを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
AGENTS.mdrules/cache-refetch-triggers.mdcache-stale-time.mdmigration-cache-time-to-gc-time.mdmigration-context-to-query-client.mdmigration-hydration-boundary.mdmigration-initial-page-param.mdmigration-keep-previous-data.mdmigration-misc-breaking-changes.mdmigration-query-callbacks-removed.mdmigration-refetch-interval-callback.mdmigration-refetch-page-to-max-pages.mdmigration-remove-method.mdmigration-single-signature.mdmigration-status-pending.mdmigration-suspense-hooks.mdmigration-throw-on-error.mdmutation-callback-separation.mdmutation-direct-cache-update.mdmutation-invalidation.mdmutation-optimistic-updates.mdmutation-prefer-mutate.mdquery-dependent-enabled.mdquery-key-factory.mdquery-keys-as-dependencies.mdquery-placeholder-vs-initial.mdquery-select-transforms.mdquery-status-check-order.mdquery-tracked-properties.mdtesting-fresh-client.md詳細
React Query のベストプラクティス
重要: このガイドは React Query v4 を対象としています。パターンによっては v5 で異なる場合があります。
TkDodo の信頼性の高いブログシリーズに基づく、React Query v4(TanStack Query)の包括的なガイドです。影響度順に分類された 7 カテゴリ、24 のルールが含まれています。
適用するタイミング
以下の場合に、これらのガイドラインを参照してください。
- 新しいクエリやミューテーションを実装するとき
- React Query に WebSocket を統合するとき
- クエリの無効化パターンを設定するとき
- React Query の動作をデバッグするとき
- レンダリングのパフォーマンスを最適化するとき
- TypeScript との統合に関する質問があるとき
優先度別のルールカテゴリ
| 優先度 | カテゴリ | 影響度 | プレフィックス |
|---|---|---|---|
| 1 | クエリキーとパターン | CRITICAL | query- |
| 2 | ミューテーションと更新 | CRITICAL | mutation- |
| 3 | キャッシュ戦略 | HIGH | cache- |
| 4 | WebSocket の統合 | HIGH | websocket- |
| 5 | TypeScript との統合 | MEDIUM | typescript- |
| 6 | テストパターン | MEDIUM | testing- |
| 7 | よくある落とし穴 | MEDIUM | troubleshoot- |
| 8 | v5 への移行 | HIGH | migration- |
クイックリファレンス
1. クエリキーとパターン(CRITICAL)
query-keys-as-dependencies- すべての queryFn のパラメーターを queryKey に含めるquery-key-factory- キーを一貫して生成するためにファクトリーパターンを使用するquery-select-transforms- データ変換には select オプションを使用するquery-status-check-order- まずデータ、次にエラー、最後に読み込み状態を確認するquery-tracked-properties- 使用するプロパティのみを分割代入するquery-placeholder-vs-initial- それぞれのアプローチを使うタイミングを把握するquery-dependent-enabled- 依存するクエリには enabled オプションを使用する
2. ミューテーションと更新(CRITICAL)
mutation-prefer-mutate- mutateAsync() より、コールバックを使う mutate() を使用するmutation-invalidation- ミューテーション後にクエリを無効化するmutation-direct-cache-update- 適切な場合はキャッシュを直接更新するmutation-optimistic-updates- 成功をすぐに表示し、失敗時にはロールバックするmutation-callback-separation- クエリのロジックはフックに、UI の効果はコンポーネントに記述する
3. キャッシュ戦略(HIGH)
cache-stale-time- ドメインに適した staleTime を設定するcache-refetch-triggers- 本番環境では再取得のトリガーを有効にしておく
4. WebSocket の統合(HIGH)
websocket-event-invalidation- イベントを使って無効化をトリガーするwebsocket-stale-time-infinity- WS で管理するデータには staleTime: Infinity を設定するwebsocket-reconnection- 再接続時に古いクエリを無効化する
5. TypeScript との統合(MEDIUM)
typescript-infer-dont-specify- TypeScript の型推論に任せ、queryFn に型を付けるtypescript-zod-validation- 実行時の検証には Zod を使用する
6. テストパターン(MEDIUM)
testing-fresh-client- テストごとに新しい QueryClient を作成するtesting-msw-mocking- ネットワークのモックには MSW を使用する
7. よくある落とし穴(MEDIUM)
troubleshoot-copy-to-state- クエリデータをローカル状態にコピーしないtroubleshoot-missing-key-deps- すべての依存関係をクエリキーに含めるtroubleshoot-fetch-not-reject- fetch で HTTP エラーを処理する
8. v5 への移行(重要)
migration-single-signature- すべてのフックが単一のオブジェクト引数を取るようになりましたmigration-status-pending- status の 'loading' が 'pending' に変更され、isLoading のセマンティクスも変更されましたmigration-cache-time-to-gc-time- cacheTime が gcTime に改名されましたmigration-keep-previous-data- keepPreviousData が、identity 関数を使う placeholderData に変更されましたmigration-query-callbacks-removed- useQuery から onSuccess/onError/onSettled が削除されましたmigration-suspense-hooks- 新しい useSuspenseQuery、useSuspenseInfiniteQuery フックが追加されましたmigration-throw-on-error- useErrorBoundary が throwOnError に改名されましたmigration-remove-method- query.remove() が削除されました。queryClient.removeQueries() を使用してくださいmigration-initial-page-param- infinite query で initialPageParam が必須になりましたmigration-refetch-page-to-max-pages- refetchPage が maxPages に置き換えられましたmigration-hydration-boundary- Hydrate コンポーネントが HydrationBoundary に改名されましたmigration-refetch-interval-callback- refetchInterval コールバックが受け取るのは query のみになりましたmigration-context-to-query-client- context prop が削除されました。queryClient を直接渡してくださいmigration-misc-breaking-changes- React 18 が最低要件になり、サーバーでの retry=0、hashKey、isDataEqual などが変更されました
基本的な考え方
- React Query はデータ取得ライブラリではありません - 非同期状態マネージャーです
- サーバー状態 ≠ クライアント状態 - グローバル状態マネージャーで両者を混在させないでください
- Stale-while-revalidate - キャッシュ済みデータをすぐに表示し、バックグラウンドで取得します
- クエリキーは依存関係です - queryFn で使うすべての変数を含めてください
使用方法
詳しい説明とコード例については、各ルールファイルを参照してください。
rules/query-key-factory.md
rules/mutation-invalidation.md
rules/websocket-event-invalidation.md
各ルールファイルには、次の内容が含まれています。
- 重要な理由の簡潔な説明
- 誤ったコード例
- 正しいコード例
コンパイル済みドキュメント全体
すべてのルールを展開した完全なガイドについては、AGENTS.md を参照してください
コメント
Markdown 対応