Next.jsのstandaloneビルド

Next.js v12以降、configで outputstandalone を設定することで、ビルド時にstandalone用の成果物を生成してくれるようになったみたいです。

具体的には、次のように指定した場合を指します。

next.config.js
module.exports = {
  output: 'standalone',
  // 他のプロパティは割愛
}

公式ドキュメントのリンクを貼っておきます。

https://nextjs.org/docs/advanced-features/output-file-tracing

掻い摘むと...

  • ビルド成果物 .next/ ディレクトリ中の standalone/ ディレクトリにstandalone用のコードを出力する。
    • standalone を指定していない場合は生成されないディレクトリです。
  • 実行に必要な分のみのdependencies(node_modules/)が standalone ディレクトリに同梱される。
    • つまり、ビルド成果物が既にあれば、実行する前にdependenciesをインストールする作業は不要になる。
  • .next/server.js をNode.jsで実行する形式が採れる。(standaloneでない場合は next start 実行)
  • public/.next/static/.next/standalone/ に含まれないので、もし必要な場合はそれらをコピーする必要がある。

印象としては、実行に必要な分のみが含まれた成果物が得られるので、Next.jsアプリケーションをコンテナで動かす際のイメージサイズ削減が期待できるのかと思います。

なお、standalone を利用したイメージ定義は Next.js examples/with-docker(https://github.com/vercel/next.js/blob/canary/examples/with-docker/Dockerfile)Dockerfile が参考になりそうです。