バージョン12へのアップグレード方法

バージョン12にアップグレードするには、以下のコマンドを実行してください:

Terminal
npm i next@12 react@17 react-dom@17 eslint-config-next@12
Terminal
yarn add next@12 react@17 react-dom@17 eslint-config-next@12
Terminal
pnpm up next@12 react@17 react-dom@17 eslint-config-next@12
Terminal
bun add next@12 react@17 react-dom@17 eslint-config-next@12

補足: TypeScriptを使用している場合、@types/react@types/react-domも対応するバージョンにアップグレードしてください。

12.2へのアップグレード

ミドルウェア - 12.2以前でミドルウェアを使用していた場合、詳細はアップグレードガイドを参照してください。

12.0へのアップグレード

Node.jsの最低バージョン - Node.jsの最低バージョン要件が12.0.0からネイティブESモジュールをサポートする最初のバージョンである12.22.0に引き上げられました。

Reactの最低バージョン - Reactの最低要件バージョンは17.0.2です。アップグレードするには、ターミナルで以下のコマンドを実行します:

Terminal
npm install react@latest react-dom@latest

yarn add react@latest react-dom@latest

pnpm update react@latest react-dom@latest

bun add react@latest react-dom@latest

BabelからSWCへの移行

Next.jsでは現在、JavaScript/TypeScriptのコンパイルにRustベースのコンパイラSWCを使用しています。この新しいコンパイラは、個々のファイルのコンパイルにおいてBabelと比べて最大17倍、Fast Refreshでは最大5倍の高速化を実現しています。

Next.jsはカスタムBabel設定を持つアプリケーションとの完全な後方互換性を提供します。styled-jsxやgetStaticProps/getStaticPaths/getServerSidePropsのツリーシェイキングなど、Next.jsがデフォルトで処理するすべての変換はRustに移植されています。

アプリケーションにカスタムBabel設定がある場合、Next.jsは自動的にJavaScript/TypeScriptのコンパイルにSWCを使用せず、Next.js 11と同じようにBabelを使用するようにフォールバックします。

現在カスタムBabel変換を必要とする外部ライブラリとの統合の多くは、近い将来RustベースのSWC変換に移植される予定です。これには以下が含まれますが、これらに限定されません:

  • Styled Components
  • Emotion
  • Relay

SWCの採用を支援する変換の優先順位付けを行うため、このフィードバックスレッド.babelrcを共有してください。

ミニフィケーションにTerserからSWCへ移行

next.config.jsでフラグを設定することで、JavaScriptのミニフィケーションにTerserの代わりに最大7倍高速なSWCをオプトインで使用できます:

next.config.js
module.exports = {
  swcMinify: true,
}

SWCを使用したミニフィケーションはオプトインフラグとして提供され、Next.js 12.1でデフォルトになる前により多くの実際のNext.jsアプリケーションでテストできるようになっています。ミニフィケーションに関するフィードバックがある場合は、このフィードバックスレッドに投稿してください。

styled-jsxのCSSパーシング改善

Rustベースのコンパイラに加えて、styled-jsxのBabel変換で使用されているものに基づいた新しいCSSパーサーを実装しました。この新しいパーサーはCSSの処理が改善され、以前は検出されず予期しない動作を引き起こしていた不正なCSSが開発時やnext build時にエラーとして報告されるようになりました。

この変更により、不正なCSSは開発時とnext build時にエラーをスローします。この変更はstyled-jsxの使用にのみ影響します。

next/imageのラッピング要素変更

next/imageは現在、<img><div>ではなく<span>内にレンダリングします。

アプリケーションに.container spanのようなspanを対象とした特定のCSSがある場合、Next.js 12にアップグレードすると<Image>コンポーネント内のラッピング要素が誤ってマッチする可能性があります。これを回避するには、セレクタを.container span.itemのような特定のクラスに制限し、関連するコンポーネントを<span className="item" />のように更新してください。

アプリケーションにnext/image<div>タグを対象とした特定のCSS(例:.container div)がある場合、マッチしなくなる可能性があります。セレクタを.container spanに更新するか、好ましくは<Image>コンポーネントを<div className="wrapper">でラップし、.container .wrapperのように対象にしてください。

classNameプロパティは変更されておらず、引き続き基礎となる<img>要素に渡されます。

詳細はドキュメントを参照してください。

HMR接続がWebSocketを使用するように変更

以前、Next.jsはHMRイベントを受信するためにserver-sent events接続を使用していました。Next.js 12ではWebSocket接続を使用するようになりました。

Next.js開発サーバーへのリクエストをプロキシする場合、アップグレードリクエストが正しく処理されるようにする必要がある場合があります。例えば、nginxでは以下の設定を追加する必要があります:

location /_next/webpack-hmr {
    proxy_pass http://localhost:3000/_next/webpack-hmr;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}

Apache(2.x)を使用している場合、サーバーにWebSocketを有効にするために以下の設定を追加できます。ポート、ホスト名、サーバー名を確認してください。

<VirtualHost *:443>
 # ServerName yourwebsite.local
 ServerName "${WEBSITE_SERVER_NAME}"
 ProxyPass / http://localhost:3000/
 ProxyPassReverse / http://localhost:3000/
 # Next.js 12はWebSocketを使用
 <Location /_next/webpack-hmr>
    RewriteEngine On
    RewriteCond %{QUERY_STRING} transport=websocket [NC]
    RewriteCond %{HTTP:Upgrade} websocket [NC]
    RewriteCond %{HTTP:Connection} upgrade [NC]
    RewriteRule /(.*) ws://localhost:3000/_next/webpack-hmr/$1 [P,L]
    ProxyPass ws://localhost:3000/_next/webpack-hmr retry=0 timeout=30
    ProxyPassReverse ws://localhost:3000/_next/webpack-hmr
 </Location>
</VirtualHost>

expressのようなカスタムサーバーの場合、リクエストが正しく渡されるようにapp.allを使用する必要があるかもしれません。例:

app.all('/_next/webpack-hmr', (req, res) => {
  nextjsRequestHandler(req, res)
})

Webpack 4のサポート終了

既にwebpack 5を使用している場合はこのセクションをスキップできます。

Next.jsはNext.js 11でコンパイルのデフォルトとしてwebpack 5を採用しました。webpack 5アップグレードドキュメントで告知した通り、Next.js 12ではwebpack 4のサポートが削除されました。

アプリケーションがまだオプトアウトフラグを使用してwebpack 4を使用している場合、webpack 5アップグレードドキュメントへのリンクを含むエラーが表示されます。

targetオプションの非推奨化

next.config.jstargetが含まれていない場合はこのセクションをスキップできます。

targetオプションは非推奨となり、ページを実行するために必要な依存関係をトレースする組み込みサポートに置き換えられました。

next build中、Next.jsは自動的に各ページとその依存関係をトレースし、アプリケーションの本番バージョンをデプロイするために必要なすべてのファイルを決定します。

現在targetオプションをserverlessに設定している場合は、新しい出力を活用する方法に関するドキュメントを参照してください。