fetch
Next.jsはWeb fetch()
APIを拡張して、サーバの各リクエストが独自の永続的なキャッシングおよび再検証セマンティクスを設定できるようにします。
ブラウザでは、cache
オプションは、fetchリクエストがブラウザの_HTTPキャッシュとどのようにやり取りするかを示します。この拡張では、cache
はサーバー側の_fetchリクエストがフレームワークの永続的なData Cacheとどのようにやり取りするかを示します。
Server Components内でasync
やawait
を使って直接fetch
を呼び出すことができます。
- TypeScript
- JavaScript
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>
)
}
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のData Cacheとリクエストがどのようにやり取りするかを設定します。
fetch(`https://...`, { cache: 'force-cache' | 'no-store' })
no-store
(デフォルト):Next.jsは、キャッシュを参照せず、すべてのリクエストでリモートサーバーからリソースを取得し、ダウンロードされたリソースでキャッシュを更新しませんforce-cache
:Next.jsはData Cache内で一致するリクエストを検索します- 一致があり、それが新鮮であれば、キャッシュから返されます
- 一致がないか古い一致であれば、Next.jsはリモートサーバーからリソースを取得し、ダウンロードされたリソースでキャッシュを更新します
options.next.revalidate
fetch(`https://...`, { next: { revalidate: false | 0 | number } })
リソースのキャッシュの有効期間(秒単位)を設定します。
false
- リソースを無期限にキャッシュします。これにより、HTTPキャッシュは時間の経過とともに古いリソースを削除することがあります0
- リソースがキャッシュされないようにしますnumber
- (秒単位)リソースが最大n
秒間キャッシュされるべきであることを指定します
Good to know:
- 個々の
fetch()
リクエストがルートのデフォルトのrevalidate
より低いrevalidate
数を設定した場合、ルート全体の再検証インターバルが短くなります- 同一のルートにおいて、同じURLを持つ二つのfetchリクエストが異なる
revalidate
値を持つ場合、低い方の値が使用されます- 便利なことに、
revalidate
が数値に設定されている場合、cache
オプションを設定する必要はありません{ revalidate: 3600, cache: 'no-store' }
のような矛盾したオプションはエラーを引き起こします
options.next.tags
fetch(`https://...`, { next: { tags: ['collection'] } })
リソースのキャッシュタグを設定します。このデータは、revalidateTag
を使用してオンデマンドで再検証することができます。カスタムタグの最大長は256文字で、最大タグ項目数は64です。
トラブルシューティング
開発環境でfetch cache: 'no-store'
が新鮮なデータを表示しない
Next.jsは、ローカル開発環境での高速な応答と課金API呼び出しのコストを削減するために、Server Components内のfetch
レスポンスをホットモジュールリプレースメント(HMR)間でキャッシュします。
デフォルトでは、HMR キャッシュは、cache: 'no-store'
オプションを含むすべてのfetchリクエストに適用されます。これにより、HMRの更新間でキャッシュされていないリクエストは新鮮なデータを表示しません。ただし、ナビゲーションまたはページ全体を再読み込みするとキャッシュがクリアされます。
詳細はserverComponentsHmrCache
のドキュメントを参照してください。
バージョン履歴
バージョン | 変更点 |
---|---|
v13.0.0 | fetch が導入されました |