name: nextjs-cache-management
Next.js App Router のキャッシュ問題を素早く診断・解決するスキル。
これを忘れると「データ追加したのに一覧に出てこない」問題が起きる!
// ❌ 間違い: キャッシュ無効化なし
export async function addTask(data: TaskInput) {
await db.insert(tasks).values(data);
// キャッシュが古いまま!
}
// ✅ 正解: mutation後にupdateTag
import { updateTag } from 'next/cache';
export async function addTask(data: TaskInput) {
await db.insert(tasks).values(data);
updateTag('tasks'); // ← これが必須!
}
unstable_cache — データ取得のキャッシュimport { unstable_cache } from 'next/cache';
const getTasks = unstable_cache(
async () => await db.select().from(tasks),
['tasks'], // キャッシュキー
{
tags: ['tasks'], // 無効化用タグ
revalidate: 30 // 秒数(オプション)
}
);
updateTag — Server Action内からの即時無効化import { updateTag } from 'next/cache';
// Server Action内で使用
export async function addTask(data: TaskInput) {
await db.insert(tasks).values(data);
updateTag('tasks'); // 同一リクエスト内で即座に反映
}
特徴:
revalidateTag — 外部からの無効化import { revalidateTag } from 'next/cache';
// Next.js 16では2引数必須
revalidateTag('tasks', 'default');
注意: Server Action内からの即時更新には updateTag を使う。
actions.ts を確認 — mutation関数に updateTag があるか?unstable_cache の tags と updateTag の引数が一致してるか?キャッシュタグの一元管理パターンと実際の修正例は references/cache-tag-pattern.md を参照。
| 間違い | 正解 |
|---|---|
mutation後に updateTag を忘れる | 全mutation関数に追加 |
| タグ名のtypo | 定数で一元管理 |
| 一部のmutationだけ対応 | add/edit/delete/sync 全て対応 |
revalidateTag を Server Action内で使う | updateTag を使う |
このスキルは自己拡張型。キャッシュ問題を解決したら LEARNINGS.md に追記。
updateTag 忘れ: これが最も多い問題。add/edit/delete だけでなく、sync系・AI系などすべてのmutation関数に updateTag を追加する。1箇所でも漏れると「追加したのに一覧に出ない」問題が起きるrevalidateTag と updateTag の混同: Server Action内からの即時無効化は updateTag を使う。revalidateTag はServer Action内では read-your-own-writes に対応しないunstable_cache の tags と updateTag の引数が1文字でも違うと無効化が効かない。CACHE_TAGS 定数で一元管理するrevalidateTag の引数変更: Next.js 16では revalidateTag('tasks', 'default') と2引数が必須。1引数で呼ぶとエラーになる