Next.js 16 で変わったこと。上げると壊れる所
Next.js 16 に上げると、params の読み方・revalidateTag の引数・middleware の名前・next.config の eslint・next/image の既定が変わります。
止まるものより、黙って変わるものが怖い
公式のアップグレードガイドには多くの変更が並んでいます。このページでは、そのうちこのサイトで実機に当てたものを、壊れ方で分けました。どれも Next.js 16.3.5 で確かめています。
| 変わったもの | 以前の書き方のまま | 詳しく |
|---|---|---|
| params / searchParams | 型チェックも通り、値が undefined(本番はログも出ない) | params が undefined になる |
| next/image の quality | 90 と書いても 75 に丸められる(エラーなし) | next/image の使い方 |
| revalidateTag | 型チェックで止まる。外すと警告付きで動く | revalidateTag の第2引数 |
| next.config の eslint | 警告のあと型チェックで止まる。外すと何もしない | next.config の eslint |
| next/image のクエリ文字列 | ビルドが止まる | next/image の使い方 |
| middleware.ts | 動くが、ビルドのたびに告知が出る | proxy(旧 middleware)の書き方 |
上の2つは、何も言われずに挙動が変わります。ビルドが通ったことを、移行が済んだ証拠にしないでください。
黙って変わるもの
params は Promise
params と searchParams は Promise として渡されます。公式のアップグレードガイドによると、Next.js 15 で非同期になり、16 で同期のまま読む書き方が無くなりました。
実機では、同期のまま読むと型チェックも通り、本番では値が undefined になるだけで、ログにも何も出ませんでした(params が undefined になる)。cookies() と headers() も同じく await して使います。
画質は 75 だけ
quality={90} と書いても、実機では q=75 の版を読み込みました。使う画質を images.qualities に書いておく必要があります(next/image の使い方)。
止まるもの
- revalidateTag:第2引数が必須になりました。型チェックで
Expected 2 argumentsと出ます。すぐ反映したいなら Server Action でupdateTagを使います(revalidateTag の第2引数と updateTag) - next.config の eslint:
next buildがリントを走らせなくなり、設定そのものが無くなりました(next.config の eslint) - next/image のクエリ文字列:
src="/a.png?v=1"は、images.localPatternsに書かないとビルドが止まります(next/image の使い方)
名前が変わったもの
middleware.ts は proxy.ts に変わりました。実機では、middleware.ts のままでも動きますが、ビルドのたびに告知が出ました(proxy(旧 middleware)の書き方)。
ほかに気づいたこと
実機のビルドや開発サーバーで、次のことにも気づきました。
- ビルドの一覧から、ページごとの大きさの欄が無くなっていた
- 開発サーバーは、起動のときに
AGENTS.mdとCLAUDE.mdを書き出した(agentRules: falseで止められる、と出る) next buildもnext devも、何も指定しなければ Turbopack で動いた
公式のアップグレードガイドには、ほかにも Node.js 20.9 以上が要ること、並列ルートに default.js が必須になったことなどが並んでいます。上げる前に一度通して読んでください。
上げる手順
- 公式のガイドにある codemod を走らせる
- 型チェックを有効にしてビルドする(
ignoreBuildErrorsを外す)。止まるものはここで見つかる - 黙って変わるもの(上の2つ)は、本番と同じビルドで開いて確かめる
- 開発サーバーで一度ずつ開き、ログに出る文言を読む(
paramsの読み忘れはここでしか出ない)
出典
このページの内容は上記の一次情報を基準に書いています。個人ブログや二次情報を根拠にしていません。