Next.jsのstandaloneビルド
Next.js v12以降、configで output
に standalone
を設定することで、ビルド時に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
が参考になりそうです。