ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
この記事の要点
- 機械的な書き換えはコードモッドで済ませられる。
npx @next/codemod@canary upgrade latestが入口。 - 最大の破壊的変更は
params/searchParams/cookies()の同期アクセス廃止。専用のコードモッドがある。 middlewareはproxyに改名。ただし Edge ランタイムはproxyでは使えない。experimental.pprは削除。cacheComponentsは単なる改名ではないので、同時に有効化しない。- AMP・
next lint・serverRuntimeConfigは削除された。使っていれば必ず引っかかる。
バージョン 15 から 16 への移行は、変更点の数が多いわりに一つ一つは機械的です。ただし「動かない理由が分からない」タイプの詰まり方をしやすく、原因の切り分けに時間を取られがちです。この記事では、実際に遭遇する順に並べて対処法を示します。新規に学んでいる人にとっても、古い記事のコードが動かない理由の索引として使えます。
1まずコードモッドを流す
npx @next/codemod@canary upgrade latest
このコマンドが自動でやってくれるのは次のとおりです。
next.configの Turbopack 設定を新しい位置へ移すnext lintから ESLint CLI への移行middlewareからproxyへの改名- 安定化した API から
unstable_接頭辞を外す - ルートセグメント設定の
experimental_pprを削除する
ただし、これですべてが終わるわけではありません。同期的な params アクセスが残っている場合は、別のコードモッドを追加で実行します。
npx @next/codemod@canary next-async-request-api .
2前提バージョンを上げる
| 項目 | 要件 |
|---|---|
| Node.js | 20.9 以上(18 系はサポート対象外) |
| TypeScript | 5.1 以上 |
| ブラウザ | Chrome / Edge 111、Firefox 111、Safari 16.4 以上 |
手動で上げる場合は本体と React をまとめて更新します。TypeScript を使っているなら型定義も忘れずに。
npm install next@latest react@latest react-dom@latest
3同期アクセスの廃止
バージョン 15 で非同期化され、互換のために同期アクセスも残されていた API が、16 で完全に非同期のみになりました。対象は次のとおりです。
cookies()、headers()、draftMode()layout/page/route/defaultのparamspageのsearchParamsopengraph-image/twitter-image/icon/apple-iconのparams
// 15 まで(もう動かない)
export default function Page({ params }) {
const slug = params.slug
}
// 16
export default async function Page({ params }) {
const { slug } = await params
}
画像生成関数では id も Promise になりました。generateImageMetadata 側の params は同期のままという非対称があるので、両方を書いている場合は注意してください。sitemap の id も同様に Promise です。
4Turbopack が既定になったことによる影響
--turbopack は不要になりました。逆に、独自の Webpack 設定を持つプロジェクトで next build を実行すると、設定の不整合を避けるためビルドが失敗します。
①そのまま Turbopack で建てる(
--turbopack を明示)/②設定を Turbopack 向けに移行する/③--webpack で従来のバンドラを使い続ける。自分で書いていなくても、プラグインが
webpack オプションを追加していることがあります。依存パッケージを確認してください。Sass の ~ 接頭辞(@import '~bootstrap/...')は Turbopack では使えません。接頭辞を外すか、turbopack.resolveAlias で吸収します。
5middleware から proxy へ
mv middleware.ts proxy.ts
関数名も proxy に変えます。設定フラグも skipMiddlewareUrlNormalize → skipProxyUrlNormalize のように改名されました。
ここで一点だけ注意が要ります。proxy の実行環境は Node.js に固定されており、Edge ランタイムは使えません。Edge を前提にした処理がある場合は、当面 middleware のまま運用する判断もあり得ます。
6キャッシュ関連の変更
API 側の変更も押さえておきます。
| API | 変更内容 |
|---|---|
revalidateTag | 第 2 引数(cacheLife プロファイル名)が必須になった |
updateTag | 新設。Server Actions 専用で、即座に反映される |
refresh | 新設。クライアントのルーターだけを更新する |
cacheLife / cacheTag | 安定化。unstable_ 接頭辞が不要になった |
7削除されたもの
| 削除対象 | 代替 |
|---|---|
AMP(next/amp、amp 設定) | 標準機能で置き換える |
next lint コマンドと eslint 設定 | ESLint / Biome を npm スクリプトから直接呼ぶ |
serverRuntimeConfig / publicRuntimeConfig | 環境変数(必要なら connection() 併用) |
devIndicators の一部オプション | 指標表示そのものは残る |
unstable_rootParams | next/root-params |
next/legacy/image | next/image(非推奨) |
8気づきにくい挙動の変化
- 並行ルートに
default.tsxが必須:無いとビルドが失敗します。notFound()を呼ぶかnullを返すファイルを置きます。 - スムーススクロールの上書きをやめた:
htmlにscroll-behavior: smoothを設定していると、遷移時もスムーズにスクロールするようになりました。以前の挙動に戻すにはdata-scroll-behavior="smooth"をhtmlに付けます。 next devとnext buildが同時に実行できる:出力先が分かれました。開発サーバーの出力は.next/devです。同じプロジェクトでの二重起動はロックで防がれます。- ビルド出力から
sizeとFirst Load JSが消えた:サーバーコンポーネント構成では正確でなかったためです。実測にはブラウザの計測ツールを使います。 next dev時にprocess.argvに'dev'が含まれない:設定ファイルの読み込み回数が減ったためです。判定はNODE_ENVで行います。- ESLint がフラット設定を既定にした:
.eslintrc形式を使っている場合は移行を検討します。
9エラーから原因を逆引きする
| 症状 | おそらくの原因 |
|---|---|
params の値が取れない | await していない |
| ビルドが Webpack 設定を理由に落ちる | Turbopack が既定になった影響 |
next lint が無いと言われる | コマンドが削除された |
revalidateTag で型エラー | 第 2 引数の不足 |
middleware が動かない | proxy への改名 |
| 並行ルートでビルドが失敗する | default.tsx の不足 |
| 画像が 400 を返す | クエリ付きローカル画像、またはローカル IP の制限 |
| 画質が指定と違う | qualities の既定値による丸め |
| Server Action が見つからない | 複数インスタンスで暗号鍵が不一致 |
10移行の進め方
実務では、次の順で進めると切り分けが楽になります。
- Node.js と TypeScript を先に上げ、現行バージョンのまま動作を確認する
- 本体を更新し、コードモッドを流す
- ビルドを通す(Turbopack・非同期 API・並行ルートの 3 点が主な壁)
- 削除された機能の使用箇所を潰す
- ここまでを本番に出して安定させる
- 別作業として
cacheComponentsの採用を検討する
とくに 6 を 3 と同時にやらないことが重要です。キャッシュモデルの移行は設計変更を伴うため、バージョン更新と混ぜると原因の特定が困難になります。
ここまでで、シリーズはひととおり完結です。個々のトピックは 目次 から辿れます。
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
子ページはありません
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 Spring Frameworkのアノテーション一覧
- 7 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- PHPでのファイルアップロード方法|multipart/form-dataと$_FILES 2026-08-07 17:15:57
- PHP $_SERVERとは|DOCUMENT_ROOT・PHP_SELFなど主な要素 2026-08-07 17:15:57
- Scratchのアカウントの作り方|メールアドレスとユーザー名の登録手順 2026-08-07 17:15:57
- djangoにおけるMVCアプリケーション実装例 2026-08-07 17:15:57
- Bluetoothとは|仕組み・BLEとClassicの違い・用途 2026-08-07 17:15:57
- Spring Bootのテスト入門|@SpringBootTestとJUnitでの単体・結合テスト 2026-08-07 17:15:57
- Java とは?言語仕様・JVM・主要フレームワーク一覧 2026-08-07 17:15:56
- インストール方法(Windows版) 2026-08-07 17:15:56
- APIキー取得方法 2026-08-07 17:15:56
- 【PHPフレームワーク】Laravelの使い方 2026-08-07 17:15:56
- Scratch 作品の公開方法 2026-08-07 17:15:56
- Google OAuth 2.0 認証の実装方法 2026-08-07 17:15:56
- データベースとは?RDB / NoSQL / SQL の基礎 2026-08-07 17:15:56
- インストール(eclipseプラグイン) 2026-08-07 17:15:56
- Spring Frameworkの使い方 2026-08-07 17:15:56
コメントを削除してもよろしいでしょうか?