2025-04-19
Next.jsのキャッシュが複雑で、一回ちゃんと勉強しておかないといけないなと思ったので、勉強することにしました https://nextjs.org/docs/app/building-your-application/caching こちらのドキュメントの内容をまとめます
Next.jsには主に4つのキャッシュがあります
デフォルトで、Next.jsはなるべくキャッシュを使い、パフォーマンスを向上させるようにしています。 つまい、なるべく静的にレンダリングして、リクエストはキャッシュするようにしています。
Request MemoizationはReactの機能です。
Next.jsがfetch
APIを拡張し、自動でRequest Memoizationを行うようにしています。
Request Memoizationはレンダリングが完了するとメモリをリセットするようになっています。
つまり、ページをレンダリングするときに同じリクエストをしても一回の実行で済むようになるキャッシュと言えます
注意点としては、Request MemoizationはGETに対してのみ有効となっており、他のHTTPメソッドでRequest Memoizationを使用したい場合は、Reactのcache機 を使う必要があります。
Next.jsはデフォルトでサーバーリクエストとデプロイ時にデータを永続敵にキャッシュします。
これは、Next.jsがfetch
APIを拡張し、それぞれのサーバーでのリクエストをキャッシュするようにすることで実現しています。
Data Cacheは永続敵にキャッシュされるため、キャッシュを更新する必要がある場合は、自分たちで設定をする必要があります。
fetch('https://...', { next: { revalidate: 3600 } })
と、fetch
APIのオプションにnext.revalidate
を指定することで、キャッシュの有効期限を指定することができます。revalidatePath
や、revalidateTag
を使用することでキャッシュを更新することができます。Next.jsは自動でビルド時にルートをレンダリングし、キャッシュを作成します。 これは毎回リクエストをサーバーでレンダリングする代わりにルートのキャッシュを提供することで最適化を計り、ページの読み込み時間を短縮します。 Full Route Cacheを理解するには、Reactがレンダリングをどのように処理しているか、そして、Next.jsが結果をどのようにキャッシュしているかを理解する必要があります。
サーバーで、Next.jsはReactのAPIを使用してレンダリングを行います。 このレンダリングは2つのステップに分かれています。
Next.jsはデフォルトでReact Server Components PayloadとHTMLの結果をキャッシュしています。 これは静的にレンダリングされたルートにビルド時や、再バリデーション時にキャッシュが作成されます。
クライアントサイドでは以下の手順でサーバーから生成されたReact Server Components PayloadとHTMLを使用します。
React Server Components PayloadはクライアントサイドのRouter Cacheにキャッシュされます。 Router Cacheは前に訪れたルートや、Link先のページを事前フェッチすることで、ページ遷移のパフォーマンスを向上させます。
静的ルートはビルド時にFull Route Cacheが作成されますが、動的ルートは初めてページが読み込まれたときにFull Route Cacheが作成されます。
Router Cacheはインメモリのクライアントサイドのキャッシュです。 レイアウト、ローディング、ページに別れたそれぞれのRSC Payload(React Server Components Payload)を保持します。 ページはデフォルトではキャッシュされませんが、ブラウザーの戻るや、進むボタンを使用したときに、キャッシュが使用されます。 ページでもキャッシュを利用するには、staleTimes オプションを設定します。