fetch
Next.jsは、サーバー上の各リクエストが独自の永続的なキャッシングと再検証のセマンティクスを設定できるように、Web fetch()
APIを拡張しています。
ブラウザでは、cache
オプションはfetchリクエストがブラウザのHTTPキャッシュとどのようにやり取りするかを示します。この拡張機能により、cache
はサーバーサイドのfetchリクエストがフレームワークの永続的なデータキャッシュとどのようにやり取りするかを示します。
サーバーコンポーネント内でfetch
をasync
とawait
で直接呼び出すことができます。
export default async function Page() {
let data = await fetch('https://api.vercel.app/blog')
let posts = await data.json()
return (
<ul>
{posts.map((post) => (
<li key={post.id}>{post.title}</li>
))}
</ul>
)
}
fetch(url, options)
Next.jsはWeb fetch()
APIを拡張しているため、利用可能な任意のネイティブオプションを使用できます。
options.cache
リクエストがNext.jsデータキャッシュとどのようにやり取りするかを設定します。
fetch(`https://...`, { cache: 'force-cache' | 'no-store' })
auto no cache
(デフォルト): 開発環境では、Next.jsはすべてのリクエストでリモートサーバーからリソースをフェッチしますが、ルートが静的にプリレンダリングされるため、next build
中は1回だけフェッチします。ダイナミックAPIがルートで検出された場合、Next.jsはすべてのリクエストでリソースをフェッチします。no-store
: ルートでダイナミックAPIが検出されない場合でも、Next.jsはすべてのリクエストでリモートサーバーからリソースをフェッチします。force-cache
: Next.jsは、データキャッシュ内で一致するリクエストを探します。- 一致するものが存在し、それが最新である場合、キャッシュから返されます。
- 一致するものがないか、古い一致である場合、Next.jsはリモートサーバーからリソースをフェッチし、ダウンロードしたリソースでキャッシュを更新します。
options.next.revalidate
fetch(`https://...`, { next: { revalidate: false | 0 | number } })
リソースのキャッシュ保持期間(秒単位)を設定します。
false
- リソースを無期限にキャッシュします。意味的にはrevalidate: Infinity
と同等です。HTTPキャッシュは、時間とともに古いリソースを削除する場合があります。0
- リソースがキャッシュされるのを防ぎます。number
- (秒単位) リソースのキャッシュ保持期間を最大n
秒に指定します。
知っておくと良いこと:
- 個々の
fetch()
リクエストが、ルートのデフォルトrevalidate
よりも小さいrevalidate
数を設定した場合、ルート全体の再検証間隔は短縮されます。- 同じルート内で同じURLを持つ2つのfetchリクエストが異なる
revalidate
値を持つ場合、小さい方の値が使用されます。- 利便性のため、
revalidate
が数値に設定されている場合、cache
オプションを設定する必要はありません。{ revalidate: 3600, cache: 'no-store' }
のような競合するオプションはエラーを引き起こします。
options.next.tags
fetch(`https://...`, { next: { tags: ['collection'] } })
リソースのキャッシュタグを設定します。データはrevalidateTag
を使用してオンデマンドで再検証できます。カスタムタグの最大長は256文字で、最大タグアイテム数は128です。
トラブルシューティング
開発環境でfetchのデフォルトauto no store
とcache: 'no-store'
が最新のデータを表示しない
Next.jsは、ローカル開発環境におけるHot Module Replacement (HMR) 全体で、より高速な応答と、課金されるAPI呼び出しのコスト削減のために、サーバーコンポーネント内のfetch
応答をキャッシュします。
デフォルトでは、HMRキャッシュは、デフォルトのauto no cache
およびcache: 'no-store'
オプションを含むすべてのfetchリクエストに適用されます。これは、キャッシュされていないリクエストがHMRの更新間で最新のデータを表示しないことを意味します。ただし、ナビゲーションまたは完全なページ再読み込み時にはキャッシュはクリアされます。
serverComponentsHmrCache
のドキュメントで詳細を確認してください。
バージョン履歴
バージョン | 変更点 |
---|---|
v13.0.0 | fetch が導入されました。 |
お役に立ちましたか?