出力
ビルド中、Next.jsは各ページとその依存関係を自動的にトレースし、アプリケーションの本番バージョンを展開するために必要なすべてのファイルを特定します。
この機能により、展開のサイズを大幅に削減できます。以前は、Dockerで展開する際に、next start
を実行するためにパッケージのdependencies
からすべてのファイルをインストールする必要がありました。Next.js 12から、.next/
ディレクトリ内の出力ファイルトレースを活用して、必要なファイルのみを含めることができます。
さらに、これにより、様々な問題を引き起こし、不要な重複を作成する非推奨のserverless
ターゲットの必要性がなくなります。
仕組み
next build
中、Next.jsは@vercel/nft
を使用して、import
、require
、fs
の使用を静的に分析し、ページが読み込む可能性のあるすべてのファイルを特定します。
Next.jsの本番サーバーもその必要なファイルがトレースされ、.next/next-server.js.nft.json
に出力されます。これは本番環境で活用できます。
.next
出力ディレクトリに出力された.nft.json
ファイルを活用するには、各トレース内のファイルリストを.nft.json
ファイルを基準とした相対パスで読み取り、展開先にコピーできます。
トレースされたファイルの自動コピー
Next.jsは、node_modules
内の選択されたファイルを含む、本番展開に必要なファイルのみをコピーするstandalone
フォルダを自動的に作成できます。
この自動コピーを利用するには、next.config.js
で有効にします:
これにより、.next/standalone
フォルダが作成され、node_modules
をインストールせずに単独で展開できます。
さらに、最小限のserver.js
ファイルも出力され、next start
の代わりに使用できます。この最小限のサーバーは、デフォルトでpublic
や.next/static
フォルダをコピーしません。これらは理想的にはCDNで処理されるべきですが、これらのフォルダを手動でstandalone/public
およびstandalone/.next/static
フォルダにコピーした後、server.js
ファイルがこれらを自動的に提供します。
補足:
- プロジェクトで特定のポートまたはホスト名でリッスンする必要がある場合は、
server.js
を実行する前にPORT
またはHOSTNAME
環境変数を定義できます。例えば、PORT=8080 HOSTNAME=0.0.0.0 node server.js
と実行すると、http://0.0.0.0:8080
でサーバーを起動できます。
注意点
- モノリポ設定でトレースする場合、デフォルトでプロジェクトディレクトリがトレースに使用されます。
next build packages/web-app
の場合、packages/web-app
がトレースのルートとなり、そのフォルダ外のファイルは含まれません。このフォルダ外のファイルを含めるには、next.config.js
でoutputFileTracingRoot
を設定できます。
- Next.jsが必要なファイルを正しく含められない、または不要なファイルを誤って含める場合があります。そのような場合、
next.config.js
のoutputFileTracingExcludes
とoutputFileTracingIncludes
を活用できます。各設定は、キーにminimatchグロブで特定のページを照合し、値としてプロジェクトルートを基準とした、トレースに含めるまたは除外するグロブの配列を受け入れるオブジェクトを受け入れます。
注意: outputFileTracingIncludes
/outputFileTracingExcludes
のキーはglobであるため、特殊文字をエスケープする必要があります。
- 現在、Next.jsは出力された
.nft.json
ファイルに対して何も行いません。これらのファイルは、Vercelなどの展開プラットフォームによって読み取られ、最小限の展開を作成する必要があります。将来のリリースでは、これらの.nft.json
ファイルを利用する新しいコマンドが計画されています。
実験的なturbotrace
依存関係のトレースは、非常に複雑な計算と分析を必要とするため、遅くなる可能性があります。私たちは、JavaScriptの実装に代わる、より高速でスマートなturbotrace
をRustで作成しました。
有効にするには、next.config.js
に次の設定を追加できます: