use cache
use cache
ディレクティブは、コンポーネント、関数、またはファイルをキャッシュ対象として指定します。ファイルの先頭に使用することで、そのファイル内のすべての関数がキャッシュ可能であることを示したり、関数の先頭にインラインで使用してその関数をキャッシュ可能としてマークしたりできます。これは実験的なNext.jsの機能であり、use client
やuse server
のようなネイティブのReact機能ではありません。
next.config.ts
ファイルでdynamicIO
フラグを使用してuse cache
ディレクティブのサポートを有効にします:
import type { NextConfig } from 'next'
const nextConfig: NextConfig = {
experimental: {
dynamicIO: true,
},
}
export default nextConfig
将来的に
use cache
ディレクティブはdynamicIO
フラグとは別に提供されます。
キャッシュは、Webアプリケーションのパフォーマンスを向上させるために、レンダリングやデータリクエストの結果を保存する技術です。非同期関数やリクエスト時のデータに依存するAPIを使用するたびに、Next.jsは自動的に動的レンダリングを選択します。これらの操作の結果を明示的にキャッシュし、use cache
ディレクティブを使用してアプリケーションのレンダリングパフォーマンスを最適化できます。
use cache
ディレクティブはunstable_cache
関数の代替を目的とした実験的な機能です。unstable_cache
はJSONデータのキャッシュに限られ、再検証期間とタグの手動定義が必要ですが、use cache
はより柔軟で、React Server Components (RSC) がシリアライズ可能なデータ、データフェッチの出力、コンポーネントの出力をキャッシュできます。
さらに、use cache
は入力と出力の両方の追跡を行うことでキャッシュの複雑さを自動的に管理し、誤ってキャッシュを汚染するリスクを軽減します。入力と出力の両方をシリアライズするため、誤ったキャッシュ取得に関する問題を回避できます。
use cache
ディレクティブ
Next.jsのuse cache
ディレクティブを使用すると、ルート全体、コンポーネント、および関数の戻り値をキャッシュできます。非同期関数を持つとき、ファイルの先頭または関数スコープ内にuse cache
を追加してキャッシュ可能にマークできます。これにより、Next.jsは戻り値を キャッシュし、後続のレンダリングで再利用できることを認識します。
// ファイルレベル
'use cache'
export default async function Page() {
// ...
}
// コンポーネントレベル
export async function MyComponent() {
'use cache'
return <></>
}
// 関数レベル
export async function getData() {
'use cache'
const data = await fetch('/api/data')
return data
}
Good to know:
use cache
ディレクティブを使用する関数は、状態の変更、DOMの直接操作、または一定の間隔でコードを実行するためのタイマーの設定などの副作用を持たない必要があります
再検証
デフォルトで、Next.jsはuse cache
ディレクティブを使用する際に 15分の再検証期間 を設定します。Next.jsはほぼ無限の有効期限を持つように設定されており、頻繁な更新が不要なコンテンツに適しています。
この再検証期間は頻繁な変更が不要なコンテンツに便利ですが、cacheLife
およびcacheTag
APIを使用してキャッシュの挙動を設定できます:
これらのAPIはクライアントとサーバーのキャッシングレイヤ間で統合されているため、キャッシュのセマンティクスを1か所で設定することで、全体に適用できます
基本的な例:
以下の例では、関数のレベルでcacheLife
関数を使用して、関数の出力に1日の再検証期間を設定する方法を示します:
import { unstable_cacheLife as cacheLife } from 'next/cache'
export async function MyComponent() {
async function getData() {
'use cache'
cacheLife('days')
const data = await fetch('/api/data')
return data
}
return // ここでデータを使用
}
キャッシュ再検証の仕組み
15分の再検証期間が設定されている場合、以下のようなことが起こります:
- Cache HIT: 15分以内にリクエストが行われると、キャッシュされたデータが提供され、キャッシュHITとなります。
- 古いデータ: 15分後にリクエストがあると、キャッシュされた値は提供されますが、現在は古くなっています。Next.jsはバックグラウンドで新しいキャッシュエントリを再計算します。
- Cache MISS: キャッシュエントリが期限切れになり、その後にリクエストが行われると、Next.jsはこれをキャッシュMISSとして扱い、データが再計算され、ソースから再度フェッチされます。
cacheLife
による時間ベースの再検証
cacheLife
関数はuse cache
ディレクティブがある場所でのみ使用でき、キャッシュプロファイルに基づいた時間ベースの再検証期間を定義できます。
use cache
ディレクティブを使用する際には、キャッシュの挙動を明示的に定義するために、常にキャッシュプロファイルを追加することをお勧めします。