Caching in NextJs
Next.jsは、アプリケーションのパフォーマンスを最適化し、コストを削減するために、包括的なキャッシュシステムを提供します。
デフォルトで最適な設定が施されており、必要に応じてカスタマイズが可能です。
概要
Next.jsは、アプリケーションのパフォーマンスを最適化し、コストを削減するために、包括的なキャッシュシステムを提供します。デフォルトで最適な設定が施されており、必要に応じてカスタマイズが可能です。
キャッシュメカニズム
| メカニズム | 対象 | 場所 | 目的 | 持続期間 |
|---|---|---|---|---|
| Request Memoization | 関数の戻り値 | サーバー | Reactコンポーネントツリーでのデータ再利用 | リクエスト中 |
| Data Cache | データ | サーバー | リクエスト間でのデータ保持 | 永続的* |
| Full Route Cache | HTMLとRSC | サーバー | レンダリングコスト削減 | 永続的* |
| Router Cache | RSCペイロード | クライアント | サーバーリクエスト削減 | セッション中 |
*revalidationで更新可能
各キャッシュの詳細
- Request Memoization
- コード例
-
// 自動的にメモ化される async function getData() { const res = await fetch('https://api.example.com/data') return res.json() } // 最初の呼び出し(キャッシュMISS) const data1 = await getData() // 2回目の呼び出し(キャッシュHIT) const data2 = await getData() - 特徴
- React組み込みの機能
- GETリクエストのみ対象
- Reactコンポーネントツリー内でのみ有効
- レンダリング完了後にクリア
- Data Cache
- 設定オプション
-
// デフォルトのキャッシュ fetch('https://api.example.com/data') // キャッシュの無効化 fetch('https://api.example.com/data', { cache: 'no-store' }) // 時間ベースの再検証 fetch('https://api.example.com/data', { next: { revalidate: 3600 } }) - Full Route Cache
- 主な特徴
- 静的ルート:ビルド時にキャッシュ、高速な応答が可能
- 動的ルート:リクエスト時にレンダリング、キャッシュされない
- Router Cache
- 機能と特徴
- メモリ内クライアントサイドキャッシュ
- ルートセグメントごとのRSCペイロード保存
- 即時ナビゲーション実現
- ReactとブラウザーのState保持
キャッシュの制御
- 再検証(Revalidation)方法
- 時間ベース
-
// 1時間ごとに再検証 fetch('https://api.example.com/data', { next: { revalidate: 3600 } }) - オンデマンド
-
// タグベース revalidateTag('collection') // パスベース revalidatePath('/path') - キャッシュの無効化
-
// Data Cacheの無効化 fetch('https://api.example.com/data', { cache: 'no-store' }) // Full Route Cacheの無効化 export const dynamic = 'force-dynamic' // Router Cacheの無効化
ベストプラクティス
- 推奨事項
- デフォルト設定の活用
- Next.jsの自動最適化を信頼
- 必要な場合のみカスタマイズ
- 適切な再検証戦略の選択
- 定期更新 → 時間ベース
- 即時更新 → オンデマンド
- キャッシュの相互作用の理解
- Data Cache → Full Route Cacheに影響
- Router Cacheは独立して動作
- Server Actionsで複数キャッシュを無効化可能
- 注意点
- 不必要なキャッシュ無効化を避ける
- パフォーマンスモニタリングを実施
- フレッシュネスとパフォーマンスのバランス
- 一般的なパターン
- ハイブリッドキャッシング
-
// 静的データ const staticData = await fetch('/api/static', { next: { revalidate: 3600 } }) // 動的データ const dynamicData = await fetch('/api/dynamic', { cache: 'no-store' }) - 選択的再検証
-
async function updateData(formData) { 'use server' await saveToDatabase(formData) revalidatePath('/affected-path') revalidateTag('affected-collection') }
このドキュメントはNext.jsのキャッシュメカニズムの基本を説明しています。より詳細な情報は公式ドキュメントを参照してください。


