【Next.js】Static Exportsの設定変更後にnext startが起動しない問題とその解決方法
Next.jsで静的ファイル(HTML, CSS, JavaScriptなど)を出力する場合に使用するStatic Exports機能ですが、v13.3
で使用方法に変更がありました。
そこで、実際に変更してみたところ、変更後にnext start
コマンドでアプリケーションが起動できなくなってしまったので解決方法を記事にしてみました。
Static Exportsの変更点
まず、Static Exports
の変更点について。
変更前
next export
コマンドを実行することで静的ファイルが出力されていましたが、このコマンドはv13.3
から非推奨となり、v14で削除されています。
"build": "next build && next export"
変更後
v13.3
からはnext.config.js
にoutput: 'export'
を設定する仕様に変更されています。
const nextConfig = {
output: 'export',
}
next start
で起動できなくなった
変更後にnext.config.js
にoutput: 'export'
を設定して、next start
でアプリケーションを起動しようとしたところ下記のエラーが発生しました。
Error: "next start" does not work with "output: export" configuration. Use "npx serve@latest out" instead
どうやらoutput: "export"
を有効にした状態ではnext start
は使えないみたいです。
ちなみにnext dev
では変更前と変わらず起動できました。(詳細は別のセクションに記載)
解決方法
まずは解決方法について。
エラーになった原因については後ほど説明します。
エラーメッセージにもUse "npx serve@latest out" instead
と記載されているようにserveを使うことで解決できます。
yarn add -D serve
"scripts": {
"dev": "next dev",
"build": "next build",
- "start": "next start",
+ "start": "serve out",
"lint": "next lint"
},
serve out
としてserve
で静的なファイルサーバーを立ててから、ビルド済みの静的ファイルが格納されているout
ディレクトリをホスティングします。
serve
をパッケージ管理しない場合は"start": "npx serve out"
に書き換えてください。
http-serverなどの他の静的ファイルサーバーを使っても解決できますが、serve
はVercelによって開発されたツールであり、Next.jsもVercelが開発しているため、Next.jsの静的ファイルを扱う際の特性に適していると言えます。
また、serveだとコードもより簡潔に書くことができます。
// http-server
"start": "http-server out -p 8000"
// serve
"start": "serve out"
next start
で起動できなくなってしまった原因について
next start
で起動できなくなってしまった原因としては、Static Exports
の設定変更による影響があげられます。
output: "export"
が設定されている場合
-
静的ファイルの出力:
next build
コマンドを実行すると、静的ファイル(HTML, CSS, JavaScriptなど)がout
ディレクトリに出力されます。これらのファイルは動的な処理を必要とせず、そのままウェブサーバー上に提供できます。 -
静的ファイルの公開:
out
ディレクトリに生成された静的ファイルは、静的ファイルサーバー上に公開する必要があります。そのため、serve
やhttp-server
のような静的ファイルサーバーが必要になります。
output: "export"
が設定されていない場合
-
ビルドされたアプリケーションの出力:
next build
コマンドを実行すると、ビルドされたアプリケーションの成果物が.next
ディレクトリに出力されます。こちらは静的ファイルだけでなく、SSRやAPIルートなど、Next.jsの動的機能をサポートするためのファイル群も含まれます。 -
アプリケーションの起動: ビルドされたアプリケーションは
.next
ディレクトリに出力され、next start
コマンドによってproduction mode
で起動されます。このnext start
コマンドによって、内部でNode.jsサーバーを起動し、SSRやAPIルートへのリクエスト処理など、Next.jsの全機能を利用可能な状態にします。
つまり、output: "export"
が設定されている場合は、out
ディレクトリに出力された静的ファイルを静的ファイルサーバー上に公開する必要があります。
この作業が抜けていたため、next start
を実行した際にエラーになっていました。
next dev
では起動できる理由
next start
と next dev
は、サーバー起動時の目的が異なります。
next start
コマンドは、ビルド済みのNext.jsアプリケーションをproduction mode
で起動するのに対し、next dev
コマンドはdevelopment mode
でアプリケーションを起動します。
development mode
では、Next.jsはSSRやSSG、APIルートなどの開発中に利用される全ての機能を活用できるようにします。
これには、リアルタイムのホットリローディングやエラーメッセージの表示など、開発を効率化するための機能が含まれています。
そのため、output: "export"
が設定された場合でも、next dev
は静的サイトを生成するのではなく、直接Next.jsのサーバー処理を通じてページを動的にレンダリングします。
したがって、output: "export"
設定による変更はnext build
とnext start
に影響しますが、開発プロセスをサポートするnext dev
の動作には影響しません。
まとめ
Static Exports
機能の変更によって、next start
が起動できなくなったことをきっかけに、Next.jsの仕様について改めて理解を深めることができました。
普段の業務などでは問題なく使いこなせてはいるものの、Next.jsの仕様について深堀りしていくと、development mode
とproduction mode
の違いであったり、理解できていなかった部分も多くあるなと感じました。
そのため、今後は定期的にドキュメントを読み返すなどして、さらに理解を深めていけたらと思っています。
記事中に認識が間違っているところがありましたら、コメントでご指摘いただけますと幸いです。
Discussion