0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Next.js 16のupdateTagとrevalidateTagの挙動を実環境で比較してみた

Posted at

Next.js 16 では新たに updateTag()が追加され、revalidateTag()の挙動が変更されたので、実環境にデモをデプロイしてそれらの違いを検証してみました。

Next.js 16 で追加された updateTag()

  • Next.js 16 では Server Actions 専用のupdateTag()が追加されました
  • 同じリクエスト内でタグ付きキャッシュを即時で期限切れにし、後続のfetchや Cache Component が「書き込み直後の値」を読み込みます

Next.js 16 で変更された revalidateTag()

  • 第 2 引数を指定するrevalidateTag(tag, profile)の形式に変更されて、profile を指定しない従来の呼び出しは非推奨となりました。
    (第 2 引数を指定しない場合は、updateTag()と同じ挙動になるそうです)

    Without profile: legacy behavior which is equivalent to updateTag

  • revalidateTag("tag-name", "max")のように"max"を指定するのが推奨とされています。
app/actions.ts
"use server";

import { revalidateTag } from "next/cache";

export default async function submit() {
  await addPost();
  revalidateTag("posts", "max");
}

デモアプリを実装して検証

実際に Server Actions でupdateTag()revalidateTag()を実行するデモアプリを実装しました。

スクリーンショット 2025-11-14 15.33.15.png

パブリックリポジトリにしてあるので、興味があればソースコードものぞいてみてください。

vercelを使って本番環境にデプロイして挙動を確認しました。

  • revalidateTag()の第 2 引数は全て"max"を指定しています
  • おまけでrevalidatePath()も検証しています

以下にその結果をまとめます。

アクション名 再検証アクションを実行 再検証アクションを実行後にリロード(1 回目) 再検証アクションを実行後にリロード(2 回目)
updateTag() 「サーバーレンダリング時刻」と「タグ付きデータ」がアクションを実行した時刻で更新される 「サーバーレンダリング時刻」と「タグ付きデータ」がリロードした時刻で更新される 変化なし
revalidateTag() 変化なし 変化なし 「サーバーレンダリング時刻」と「タグ付きデータ」が"1回目に"リロードした時刻で更新される
revalidatePath() 「サーバーレンダリング時刻」と「タグ付きデータ」と「タグなし」データがアクションを実行した時刻で更新される 「サーバーレンダリング時刻」と「タグ付きデータ」と「タグなし」がリロードした時刻で更新される 変化なし

特筆するべきは、revalidateTag()を行った後は 2 回目のリロードでデータが更新される点です。

  • 1 回目のリロードではサーバー内のキャッシュは更新されますが、クライアントにはキャッシュされていた古いデータが返ってきます
  • 2 回目のリロードではサーバー内のキャッシュはすでに更新されているため、 1 回目にリロードした時刻のデータが返ってきます

開発サーバーでの検証

実環境にデプロイせず、開発環境で検証した際は若干異なる結果となったためまとめます。

  • npm run devで開発サーバーを立ち上げた場合

    アクション名 再検証アクションを実行 再検証アクションを実行後にリロード(1 回目) 再検証アクションを実行後にリロード(2 回目)
    updateTag() 「サーバーレンダリング時刻」と「タグ付きデータ」がアクションを実行した時刻で更新される 「サーバーレンダリング時刻」がリロードした時刻で更新される 「サーバーレンダリング時刻」がリロードした時刻で更新される
    revalidateTag() 変化なし 「サーバーレンダリング時刻」がリロードした時刻で更新される 「サーバーレンダリング時刻」がリロードした時刻で更新され、「タグ付きデータ」が"1回目に"リロードした時刻で更新される
    revalidatePath() 「サーバーレンダリング時刻」と「タグ付きデータ」と「タグなし」データがアクションを実行した時刻で更新される 「サーバーレンダリング時刻」がリロードした時刻で更新される 「サーバーレンダリング時刻」がリロードした時刻で更新される
  • npm run buildnpm run startでローカルサーバーを立ち上げた場合

    アクション名 再検証アクションを実行 再検証アクションを実行後にリロード(1 回目) 再検証アクションを実行後にリロード(2 回目)
    updateTag() 「サーバーレンダリング時刻」と「タグ付きデータ」がアクションを実行した時刻で更新される 「サーバーレンダリング時刻」がリロードした時刻で更新される 変化なし
    revalidateTag() 変化なし 変化なし 「サーバーレンダリング時刻」と「タグ付きデータ」が"1回目に"リロードした時刻で更新される
    revalidatePath() 「サーバーレンダリング時刻」と「タグ付きデータ」と「タグなし」データがアクションを実行した時刻で更新される 「サーバーレンダリング時刻」がリロードした時刻で更新される 変化なし

蛇足

今回、検証用のデモアプリを作りましたが、この実装は全て GitHub Copilot Coding Agent に/taskで依頼しました。

しかもプロンプトはたったの 1 行です。

nextjsのrevalidateTagとupdateTagの挙動をテストできるページを実装してください。

GitHub Copilot Coding Agent に実装を依頼して、vercel が自動で PR のコードをテスト環境にデプロイするため、人間による作業はほぼゼロです。

この辺りの内容もそのうち記事にしたいと思います!

参考リンク

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?