ファイルの変更時にノードを再起動します


172

PHPのバックグラウンドから来ている人にとって、ノードを強制終了し、コードを変更するたびにノードを再起動するプロセスは非常に退屈なようです。ノードでスクリプトを開始するときに、コードの変更が保存されたときにノードを自動的に再起動するフラグはありますか?

回答:


94

foreverモジュールには複数のnode.jsサーバーの概念があり、現在実行中のサーバーを起動、再起動、停止、一覧表示できます。ファイルの変更を監視し、必要に応じてノードを再起動することもできます。

まだインストールしていない場合は、インストールします。

npm install forever -g

インストール後、forever次のコマンドを呼び出します。-wフラグを使用して、ファイルの変更を監視します。

forever -w ./my-script.js

さらに、ディレクトリを監視してパターンを無視できます。

forever --watch --watchDirectory ./path/to/dir --watchIgnore *.log ./start/file

+1は、開発/テストと本番の両方でかなり用途が広いです。
— smertrios 2014

1
私はこのコマンドで永遠にES2015 Expess.js / Webpackサーバーを再起動することを試みました forever -c babel-node -w --watchDirectory ./server ./server/index.js が、残念ながらそれは永遠にテールスピンに送信され、サーバーを再起動する頻度が高すぎるため、ポートがすでに使用中のエラーになります...再起動後に一時停止を追加しますか?
— Brian Di Palma

1
@BrianDiPalma監視ディレクトリの下にログなどの変更ファイルがある場合は、いくつかの無視パターンを追加する必要があります。再起動間の遅延を定義できるかどうかをドキュメントで確認してください。
— hyde

1
@hyde必要なのは遅延ではなく、-tまたはkillTree必要なオプションでした。私はbabel-nodeが強制終了されていたが、それが生成したExpressサーバーではなかったと思います。
— Brian Di Palma

2
Forever JSには、スクリプトが終了したときにNodeプロセスを強制終了しないWindowsのバグがあります。手動でノードのプロセスをkillする必要が:( stackoverflow.com/questions/14556852/...
— pmont

157

優れたオプションはNode-supervisorで、ファイルの変更時にNode.jsを再起動することは、通常、その使用方法に関する優れた記事です。

 npm install supervisor -g

アプリケーションのルートに移行した後、次を使用します

 supervisor app.js

ここでも同じですが、以前は問題なくnodemonを使用していました。
— ZenMaster 2014年

1
私も働いた。デフォルトのワイルドカード監視パラメーターをオーバーライドするserver.js必要がありました。これは常に再起動していたためです。これは、サーバーが起動時にクライアントを構築し、ファイルを変更したためです。supervisor --watch server.js server.js解決しました。
— scipilot 2015

2
ノードスーパーバイザーはもはや維持されていません。
— aleung

魅力のように動作します!!
— JRichardsz

私のお気に入りの更新間隔は、ファイルが変更されたかどうかを確認するのにほぼ瞬時です。
— NiCkニューマン2017

100

nodemonのようなものを見てください。

Nodemonは、nodemonが開始されたディレクトリ内のファイルを監視し、それらが変更された場合、ノードアプリケーションを自動的に再起動します。

例:

nodemon ./server.js localhost 8080

または単に

nodemon server

ノードがコード変更を実装するために再起動を必要とする理由は何ですか?そして、なぜ他のサーバー(Apache / PHPなど)が再起動を必要としないのですか?
— 異端者

2
@ dk49は、その場合のPHPスクリプトはすべての着信要求に対して開始され、ページの生成が完了した後に停止するためです。
— Daerdemandt

@Daerdemandtそれを共有してくれてありがとう..しかし、なぜ(どのプラットフォームでも)サーバーを起動および停止する必要があるのですか それはファイル(応答)のキャッシュを維持するためですか?サーバーはリクエスト時にディスクからファイルをロードし、それを処理してからレスポンスを送信すると思いました。サーバーサイドプログラミングは初めてです。
— 異端者

nodemonを本番環境で使用できますか?
— JoeTidee 2017年

1
(これは2012年に戻ったので)nodemonが今日どのように維持されるかはわかりませんが、セキュリティ上の理由から、ファイルが変更されるたびにサーバーをprodで再起動するかどうかはわかりません。pm2のようなものが実稼働環境に適しているかもしれません。
— Menztrual 2017年

43

この作業を簡単にするために、さまざまなNPMパッケージが用意されています。

開発用

  • nodemon:最も人気があり、積極的にメンテナンスされています
  • 永久:2番目に人気
  • node-dev:2019年5月以降コミットなし
  • スーパーバイザー:-メンテナンスされていません

本番用(クラスタリング、リモートデプロイなどの拡張機能を使用)

永遠の比較、PM2、およびStrongLoopはで見つけることができるStrongLoopのウェブサイト。


3
@ 2019 nodemonは、4つの開発オプションのうち、まだ維持されている唯一のもののようです。
— mvermand

1
@mvermandええ、nodemonを除いて、どちらにも新しいリリースは最近リリースされていません。生産に関しては、PM2はまだ十分に維持されています。
— ケイ

16

nodemonを試すこともできます

Nodemonをインストールするには

npm install -g nodemon

Nodemonを使用するには

通常、次のようにノードプログラムを開始します。

node server.js

しかし、ここでは次のようにする必要があります:

nodemon server.js

良くてシンプルな答え!
— レシモ2017

1
nodemonには迷惑なバグがあります。それは私にとって時間の浪費でした。
— kta 2017

この回答は2012 nodemonの回答とどのように異なりますか?
— Dan Dascalescu

9

node-dev

node-devは、サーバーの再起動時やファイルでエラーや変更が発生したときにデスクトップでうなり(またはlibnotify)通知を受け取りたい開発者にとって、nodemonとスーパーバイザの両方に代わる優れた手段です。

インストール:

npm install -g node-dev

nodeの代わりにnode-devを使用します。

node-dev app.js

サーバーが自動的に起動するようにファイルを変更する際の通知

ここに画像の説明を入力してください

コンソール出力

ここに画像の説明を入力してください


3

私は次のrunjsように使用します:

runjs example.js

パッケージは単に呼び出されます run

npm install -g run

2
それは良くない、ただ別のオプション
— sp2danny

この回答は、を使用する理由runと、既存の選択肢との比較を説明していれば、はるかに価値があります。別のオプションをダンプするだけでは、選択のパラドックスに寄与するだけです。(幸いなことにrun、2015年以降更新されていないため、今ではあまり選択肢になりません。)
— Dan Dascalescu

0

手順に従ってください:

  1. npm install --save-dev nodemon

  2. package.jsonの「script」セクションに次の2行を追加します。

"start": "node ./bin/www",
"devstart": "nodemon ./bin/www"

以下に示すように:

"scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "node ./bin/www",
    "devstart": "nodemon ./bin/www"
}
  1. npm run devstart

https://developer.mozilla.org/en-US/docs/Learn/Server-side/Express_Nodejs/skeleton_website


まあ、それは本質的に2012年の答えと同じですが、周りに「魔法」がより多く存在します。しかし、答えの本質は「nodemonを使う」です。リセットは接線方向です。また、形式が適切ではありませんでしたが、Davidが修正したことがわかったので、反対票を取り消します。
— Dan Dascalescu
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.