TOOLS BOX/ガイド/fetch cache
API / Option

fetch cache

Next.js が拡張した fetch のキャッシュ制御オプション。force-cache / revalidate / tags の組み合わせで、静的生成・ISR・タグ付き再検証を切り替える。

nextjsfetchcacheforce-cacherevalidateisrserver-componenttags
所属:fetch

代表的な値 / 使い方

  • fetch(url, { cache: 'force-cache' })
  • fetch(url, { next: { revalidate: 60 } })
  • fetch(url, { next: { tags: ['posts'] } })
  • fetch(url, { cache: 'no-store' })

注意点 / Pitfalls

  • ·Next.js 15 では fetch のデフォルトが no-store に変更された。明示的に force-cache または next.revalidate を指定しないとキャッシュされない
  • ·next.revalidate と cache: 'force-cache' を同時に指定した場合、revalidate の設定が優先される
  • ·next.tags を設定していないと revalidateTag を呼んでもキャッシュが無効化されない
  • ·Server Component の外(Route Handler や Server Action)で fetch してもキャッシュ挙動は同様

一緒に使う項目

補足

Next.js の fetch は Web 標準の fetch を拡張しており、next オプションでキャッシュ制御を細かく指定できる。デフォルト挙動が Next.js バージョンで変わっているため、明示的な指定を推奨。

Next.js の fetch 拡張

Next.js は Web 標準の fetch を拡張し、cache / next.revalidate / next.tags オプションでキャッシュ挙動を制御できます。

// 永続キャッシュ(ビルド時に生成・以降は再フェッチしない)
fetch(url, { cache: 'force-cache' });

// ISR(指定秒数ごとに再検証)
fetch(url, { next: { revalidate: 60 } });

// タグ付きキャッシュ(revalidateTag で即時無効化)
fetch(url, { next: { tags: ['posts'] } });

// キャッシュしない(毎回最新を取得)
fetch(url, { cache: 'no-store' });

キャッシュオプション一覧

オプション挙動向いている場面
cache: 'force-cache'永続キャッシュ。再デプロイまで再フェッチしない滅多に変わらない静的コンテンツ
next: { revalidate: N }N 秒ごとにバックグラウンドで再検証(ISR)更新頻度が低いが定期的に最新を反映したい
next: { tags: [...] }タグを付けてキャッシュ。revalidateTag で即時無効化CMS 更新・操作トリガーで特定データを更新したい
cache: 'no-store'キャッシュしない。毎回最新を取得リアルタイム性が必要・ユーザー固有データ

Next.js 15 のデフォルト変更

Next.js 14 以前と 15 以降でデフォルト挙動が変わっています。

バージョンfetch デフォルト
Next.js 14 以前force-cache(キャッシュあり)
Next.js 15 以降no-store(キャッシュなし)

Next.js 15 ではキャッシュを有効にしたい場合に明示的な指定が必要です。

// Next.js 15 でキャッシュを使う場合は明示的に指定する
fetch(url, { cache: 'force-cache' });
fetch(url, { next: { revalidate: 60 } });

revalidateTag と組み合わせる

next.tags を設定すると revalidateTag() でそのデータのキャッシュを即時無効化できます。

// fetch 側: タグを付けてキャッシュ
const posts = await fetch('/api/posts', {
  next: { tags: ['posts'] },
});

// Server Action 側: タグを指定して無効化
import { revalidateTag } from 'next/cache';

export async function createPostAction(formData: FormData) {
  await db.post.create({ data: { ... } });
  revalidateTag('posts'); // 'posts' タグのキャッシュをクリア
}

no-store(キャッシュしない指定)の詳細は → cache: 'no-store'

キャッシュ設計の全体像は → Next.js キャッシュ設計

関連ドキュメント

関連サンプル

同じテーマや技術スタックを使った実装例