📖

next startを本番に使用すべきではないたった一つの理由

に公開2

たった一つの理由

next startnpm run start) の実装にNode.jsでHTTPサーバーを提供される場合に標準的に使用されるexpressが使用されていないからです。(httpモジュールは実装が低レベルすぎるので直接使用するべきではありません)

長い理由

Next.jsのドキュメントに書いてあるよ?

Next.jsのドキュメントにはnext startが(一応)プロダクションデプロイに使えるよと書いてあります。
https://nextjs.org/docs/deployment#nodejs-server
だから、next startを本番で使うことは公式でサポートされているので何の問題もないという意見もあると思います。しかし、私はそうは思いません。その大きな理由は、Next.jsのドキュメントは無責任すぎて信用できないという点です。

ちょっと脱線します。
先ほどあげたページにはDockerfileの例が示されています。しかし、そのDockerfileではalpineイメージを使用しているのにlibc6-compatをインストールしたり、NODE_ENV=productionしていたりと公式ドキュメントとしてはかなり筋が悪い書き方をしています。
Next.jsの最新の機能として、Incremental Site Regeneration (ISR)があります。
https://nextjs.org/docs/basic-features/data-fetching#incremental-static-regeneration
この機能は一定間隔ごとにサイトを更新するのをかなり複雑なことをしてよしなにハンドリングするというものなのですが、一定期間ごとにサイト全体をリビルドする方が簡単だし問題も起こらないはずなので、主要機能として掲げるのには疑問が残ります。
以上、雑多なことを書きましたが言いたいことはNext.jsの公式ドキュメントは機能の宣伝に集中していて、リファレンスとしては信頼に値するものではないということが言いたいです。
脱線終わります。

要するに、Next.jsの公式ドキュメントに書いてあるからといって、使って安全であるとは限らないということです。

Next.jsってVercelを売るためのものです

(この節には個人の見解が大いに含まれます)
Next.jsは何のために開発されているかというと、それはVercelを売るためだと思います。公式ドキュメントでもその姿勢は隠していません。
https://nextjs.org/docs/deployment#vercel-recommended
Vercelを売るためにVercelでしか実現できないような変な(他のフレームワークが実装しないような)機能がたくさん実装されています。機能が変なので、next startの実装も大変だと思いますし、そんなに力を入れているものでもないと思うので(Vercelが売れなくなるから)、実装が不完全なのは当然だと思います。

時代はReactサイトを静的アセットして配信

Reactアプリ作成における事実上のリファレンスであるCreate React App(CRA)は、静的ファイルを生成してそれをホスティングサイトに設置してねという形になっています。それに追随してかParcelやViteなどのモダンなバンドラもそのような形になっています。Next.jsですら昔はServer Site Renderingのためのフレームワークという立ち位置でしたが、今はStatic Site Generation(要するにCRAと同じ)を主眼に置いたフレームワークに変わっています。今どきのバンドラは内蔵WebサーバーやHot Module Replacement機構を持っているので、すでに「フレームワーク」というものが時代遅れになっている感が否めませんが、それでも静的アセット配信という時流にはついていっています。
つまり、Reactのサイトを作るためにNode.jsでサーバーを立てるというのはすでに本番向けではないということです。

結論

next buildの結果をデプロイしましょう。VercelやNetlifyやAWS Amplifyに。

余談

HMRはもはやNext.jsだけの特徴ではありません。HMRしたいならParcelの方が理にかなっています。

免責事項

完全にポエムですすみませんでした

Discussion

garypippigarypippi

expressも内部ではhttpモジュールを使用していますし、expressを使用していないという一点のみでnpm run startを本番利用するべきではないというのは無理があると思います。
また、httpモジュールが低レベルというのは直接使用してはいけないという根拠にはなり得えないと思います。