本文へ移動
verified onnext@16.3.5react@19
最終検証日 2026-09-26
Next.js道場

Next.js の revalidatePath。最小構成サンプル

更新しただけでは画面は変わりません。

動いているものを触る/demo/revalidate

ファイル構成

並んでいるのは、上の画面をいま動かしている本物のファイルです。名前を押すと中身が出ます。

ファイル構成
  • app/
app/layout.tsxBuild

全ページの外側。本物のプロジェクトでは html と body をここで書きます

import type { Metadata } from "next";
 
export const metadata: Metadata = {
  title: "更新して作り直すの最小構成",
};
 
export default function RootLayout({
  children,
}: {
  children: React.ReactNode;
}) {
  return <main>{children}</main>;
}
.tsx
画面を返すファイル。HTML のような書き方ができます
.ts
画面を返さないファイル。処理とデータだけを置きます。ここに画面を書くと原因を名指ししないエラーで落ちます
Build
ビルド時に一度だけ動きます
Server
アクセスのたびにサーバーで動きます
Browser
利用者の手元で動きます

更新と、作り直しは別のこと

データを1つ増やしても、画面は変わりません。このページはビルド時に作られたものが配られているからです。

ボタンを押してから、画面が変わるまで
  1. Browser
    ボタンが押される

    普通の form の送信。

  2. Server
    データを増やす

    ここまでは、出来上がった画面に何も起きない。

  3. Server
    作り直せと言う

    revalidatePath。ここを忘れると古いまま。

  4. Browser
    新しい画面が届く

    次に開いたときには作り直されている。

この2つが1組です。片方だけでは足りません。

呼ばないとどうなるか

実機で確かめました。revalidatePath を外して2回押しても、表示は 0 のままでした。データは増えているのに、画面がそれを知りません。

作り直されたことを目で見る

このサンプルは、数だけでなくその画面が作られた時刻も出しています。

実機で確かめた動きです。

押す前        押された回数:0   作られた時刻:22:08:19
1回押した後    押された回数:1   作られた時刻:22:09:16
2回押した後    押された回数:2   作られた時刻:22:09:19

時刻が変わっているのが、作り直された証拠です。数だけを見ていると「保存されたのかな」で終わりますが、時刻まで出すと何が起きたのかが見えます。

このページはビルド時に作られている

app/page.tsx は、Cookie もヘッダーも検索語も読んでいません。だから Next.js はビルド時に作ってしまいます。

├ ○ /demo/revalidate      ← ○ はビルド時に作った印

実機で確かめました。応答は 0.004 秒です。サーバーは何も作っていません。出来上がったものを渡しているだけです。

何を作り直させるか

revalidatePath("/demo/revalidate")

渡すのはパスです。そのページの出来上がりを捨てて、次に開いたときに作り直させます。

一覧と詳細のように複数のページが同じデータを見ているときは、両方を捨てる必要があります。片方だけ捨てると、もう片方が古いまま残ります。

多くのページにまたがるデータなら、パスではなく、データに付けたタグで捨てる方法もあります(revalidateTag と updateTag)。

誰でも呼べる入口だという前提

作り直しは、サーバーに仕事をさせる操作です。だから回数を絞っています。

if (!take(`demo-revalidate:${await clientIp()}`, 20, 60_000)) return

ここから足していくとき

  • データベースへ。app/store.ts の中を置き換えるだけで、ページ側は変わりません
  • 時間で作り直す。revalidate を書くと、一定時間で自動的に古いものを捨てられます
  • 札で作り直す。複数のページをまとめて捨てたいときは、パスではなく札を使います

更新を書いたら作り直しも書く。この組を崩さなければ、あとは置き換えるだけです。

入れていないもの

このまま本番に持っていかないでください。省いてあるのは次の点です。

  • データベース。数をひとつ、プロセスの中に持っているだけです
  • 利用者ごとの区別。誰が押しても同じ数が動きます
  • 文字の保存。共有の置き場に文を書けるようにすると、誰かの文が全員に出ます
  • 失敗したときの表示。増やせなかったことを画面に返していません

出典

このページの内容は上記の一次情報を基準に書いています。個人ブログや二次情報を根拠にしていません。

理解できたか試す

では、このコードはどうなりますか。

押せるボタンを置きました。このページはビルド時に作られなくなりますか。

この問題を解くこのテーマの問題 3 問