2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Next.js を用いる際、

npx next

コマンドを用いると、ソースファイルの編集が開いているページに自動で反映されるサーバーを起動できる。
一見便利そうなこのコマンドだが、以下のような罠があるため、筆者は使わないことをオススメする。

npx next の問題点

ビルドエラーが検出されない

npx next build コマンドによるビルドを行うと、(デフォルトでは) 以下のエラーがチェックされ、エラーがあればビルドが中止される。

しかし、npx next で動かす場合は、これらのエラーが検出されず、不適切だったり不適切とみなされたりするコードでも動いてしまう。
そのため、エラーに気付けずに不適切なコードを書き進めてしまい、後でビルドを行って初めて大量のエラーに直面し、修正に一気に長時間取られる、という可能性がある。(あった)

自動更新時おかしくなることがある

npx next の長所である自動更新だが、それによりおかしな動作が発生することがある。
具体的には、以下の事象が発生することがある。(あった)

  • 設定しているはずのスタイルシートが利かなくなる
  • React の依存配列の修正時、要素数が変わったとして怒られる

スタイルシートはリロードすると直るので自動更新の問題だろうことがわかるし、余計な怒られが発生するのは気分がいいものではない。

最初のページ遷移が遅い

npx next では、サーバーの起動時ではなく各ページを最初に開いたときにコンパイルが走るため、新しいページを開くたびに数秒~十数秒程度待たされ、快適な動作確認の支障となる。

プログラムを書いている途中でも自動更新される

npx next ではソースコードを更新するたびに自動更新が走るため、プログラムを書いている途中でとりあえず保存したときや、(読み込まれるコードと読み込むコードなど) 複数のファイルにまたがる変更をする際に最初のファイルを保存したときなど、書いている途中の中途半端なプログラムを読み込まれ、無駄なエラーが発生することがある。
動作確認することを全く意図しておらず、エラーになることがわかりきっている書いている途中のプログラムを勝手に無駄に処理され、無駄にエラーを出されるのは、不快である。

ではどうするべきか

明示的にビルドを行って実行する

npx next には、これまで述べてきたような様々な問題がある。
そこで、筆者は

npx next build && npx next start

コマンドでサーバーを実行することをオススメする。
これはまず npx next build コマンドでビルドを行い、npx next start コマンドでビルドしたプログラムを実行するコマンドである。
このコマンドを用いることには、以下のような利点がある。

  • 1個のコマンドで実行できるので、シェルの補完を活用し、少ない手間で実行できる
  • ソースコードのチェックを行い、エラーや警告があれば出力してくれる
  • サーバーが起動したら、快適にページ遷移を行うことができる
  • コマンドの実行時にしかビルドしないので、中途半端なソースコードを勝手に処理されない

ブラウザの開発者ツールを使う

スタイルシートや文言などのデザインの微調整を行うには、npx next の自動更新は一見便利そうかもしれない。
しかし、スタイルシートなどの調整はブラウザの開発者ツールでもできる。
開発者ツールで調整を行い、いい感じになったら調整をソースコードに反映して再実行すればよい。
npx next では調整をしてから画面に反映されるまでに数秒かかる一方、開発者ツールであればすぐに反映されるのも利点である。

エラーを溜め込んでしまったら

npx next のみで開発を進め、不適切なコードを溜め込んでしまった際は、回復のため以下のテクニックが役に立つことがある。

TypeScript が検出するエラーを一気に出してもらう

npx next build を実行した際、ESLint が検出するエラーや警告は出せるだけ出してくれる一方、TypeScript が検出するエラーはなぜか一回の実行で1個しか出してくれない。
そのため、出たエラーを修正して npx next build を再実行し、また1個だけ出してくれたエラーを修正し……としていくと、短くない時間がかかる npx next build を何度も実行する羽目になり、大量の時間を取られてしまう。

npx tsc --noEmit

コマンドを用いることで、エラーを1個ずつではなく出せるだけ出してもらうことができ、修正の効率を上げることができる。
これにより、エラーの一覧性が上がるために修正の効率が上がるだけでなく、エラーの総量がわかるため精神の負担も軽減される。

ビルドエラーを一時しのぎする

ビルドエラーが発生した場合は、内容を考えてコードを適切に修正するべきである。
しかし、溜め込んだ大量のビルドエラーを抱え、短時間でとにかく一旦動かしたい場合などには、エラーをとりあえず回避してビルドを進めるという選択肢もある。

ここで紹介する方法はあくまで短時間でとにかく一旦エラーを回避して動かしたい場合用のものであり、後で適切な方法でエラーの修正を行うべきである。

ESLint が検出するエラーをしのぐ

next.config.js ファイルで以下の設定をすることで、ビルド時の ESLint によるチェックをスキップすることができる。

eslint: {
  ignoreDuringBuilds: true,
},

next.config.js: eslint | Next.js

TypeScript が検出するエラーをしのぐ

next.config.js ファイルで以下の設定をすることで、ビルド時の TypeScript によるチェックをスキップすることができる。

typescript: {
  ignoreBuildErrors: true,
},

next.config.js: typescript | Next.js

useSearchParams のエラーをしのぐ

Next.js 14 ではチェックを無視する設定があるが、Next.js 15 では設定での回避はできなそうである。

Missing Suspense boundary with useSearchParams | Next.js

useSearchParams() を使っているコンポーネントを <Suspense> で囲むことで、このエラーを回避できる。

本来は <Suspense> の役割
今後の React ではどの範囲を Suspense で囲むかという設計が重要になってくる
を考え、適切な場所に配置するべきだろう。

しかし、一時しのぎのためには、トップレベルの layout.tsxbody の中身全体を <Suspense> で囲んでしまえばよい。
<Suspense> は、'use client'; を書いていなくても使用できるようなので、import を合わせて3行足すだけである。

まとめ

npx next

コマンドを用いると、ビルドエラーが検出されないため不適切なコードを溜め込む原因となり、その他の問題点もあるため、使わないほうがよい。

npx next build && npx next start

コマンドでビルドを行い、サーバーを起動するのがよい。

不適切なコードを溜め込んでしまった際、

npx tsc --noEmit

コマンドを用いると、npx next ではなぜか1個ずつしか出してくれない TypeScript が検出するエラーを一気に出してもらい、修正の効率を上げることができる。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?