web-dev-qa-db-ja.com

Nodemon + babelはサーバーを複数回再起動します

私のpackage.jsonには、開発環境に使用している開始スクリプトがあります。次のようになります。

"scripts": {
    "dev": "NODE_PATH=src nodemon --watch src/ --exec babel-node src/app.js"
}

npm run devを押すと、すべてが正常に機能し、babelがすべてを正常にトランスパイルし、nodemonが監視を開始します。私はこれを見る:

[nodemon] 1.11.0
[nodemon] to restart at any time, enter `rs`
[nodemon] watching: /Users/Jonathan/Documents/swissnet/src/**/*
[nodemon] starting `babel-node src/app.js`

Src/-folder内にファイルを保存しているとき、nodemonはサーバーを再起動します。しかし、これが私の問題です。2〜3回再起動します...ファイルを保存するたびに、次のようになります。

[nodemon] restarting due to changes...
[nodemon] starting `babel-node src/app.js`
[nodemon] restarting due to changes...
[nodemon] starting `babel-node src/app.js`
[nodemon] restarting due to changes...
[nodemon] starting `babel-node src/app.js`

「rs」と入力すると、予想どおり、nodemonが1回再起動します。

これをどのように解決するのか、どこで答えを探すのかさえわかりません。私はそれをググってみました。私はgithubのパッケージのバグセクションにアクセスしています...(たぶん私はグーグルでしゃぶるだけです)。
同じ問題で私が見つけた唯一のリンクですが、答えがないようです: Nodemonはbabelを使用している場合、保存時に複数回実行されます
とにかく彼のスクリプトをNODE_PATH=src nodemon src --exec babel -w src/ --out-dir build/ --source-maps試しましたが、同じことが起こり、2回または3回再起動しました。

上記のリンクにある回答のコメントセクションで@Connorelseaが言ったように、--delay 2.5を追加すると、1回だけ再起動します。

監視対象ファイルの保存を押すと、nodemonが即座に再起動し、babelがトランスパイルを開始するのではないかと考えています。 babelが完了すると、トランスパイルされたファイルの束が保存され、src/-folderに変更が加えられたため、nodemonが再び再起動します。しかし、これをデバッグする方法がわかりません。

あなたたちが私を助けることができることを願っています!

****編集****

これを見つけた https://github.com/remy/nodemon/issues/508 しかし、彼らが持っている唯一の解決策は「nodemonをアップグレードする」ことです。現時点では1.11.0の最新のものがあります。

10

それで、今、数ヶ月後、私は何が悪いのかを理解しました。保存するとサーバーが1回再起動し、ファイルが更新されてから数秒後にbabelがコードを変換したときにサーバーが再起動するようです。だからそれはパッケージでしたbabel-nodeそれは私にこの望ましくない行動を与えていました。 2秒のnodemon遅延で動作します--delay 2 以上。

13

次のようなエグゼキュータとしてbabel-nodeを使用する必要があります。

nodemon ./index.js --exec babel-node
5
chuyik

だから誰かが私のようにこれにつまずいた場合に備えて。

遅延は機能しますが、ビルドにかかる時間は通常2秒未満であるため、機能します。

これは、それが不安定になるか、必要以上に時間がかかる可能性があります。

正しい解決策は、実際には出力ディレクトリ、またはnodemon内のファイルを無視することです。

NODE_PATH=src nodemon --watch src/ --exec babel-node src/app.js --out-file dist/app.js -- dist/app.js

5
Amos47

「ウォッチ」モードでBabelを使用してファイルをビルドするオプションがあり、Nodemonに「ビルド」フォルダーのみを監視させ、コンパイルされた出力が変更されたらアプリを再起動します。

{
  "name": "app",
  "version": "1.0.0",
  "private": true,
  "dependencies": {},
  "devDependencies": {
    "@babel/cli": "^7.6.0",
    "@babel/core": "^7.6.0",
    "@babel/preset-env": "^7.6.0",
    "nodemon": "^1.19.2"
  },
  "scripts": {
    "build": "babel src --out-dir build --source-maps=inline --verbose",
    "start": "yarn build --watch & sleep 1 && nodemon --watch build build/index.js"
  }
}

enter image description here

この例は GraphQL API Examples GitHubのリポジトリ。

2

最初は最初のbabelビルドをロードし、次に--skip-initial-buildオプションを有効にしてnodemonを使用してbabelウォッチを並行して起動しました。

しかし最後に、私が見つけたより良い回避策は、これらの利点を持つ自分のバベルウォッチャーを作ることです:

  • すべての同期を維持しながら、削除やその他のイベントを考慮に入れる

  • @compileDependenciesアノテーションシステムを追加できるようにします( https://github.com/kentcdodds/babel-plugin-preval/issues/19 を参照)

  • 公式の@babel/cliウォッチャーで使用されているchokidarのawaitWriteFinishオプションによって引き起こされたウォッチングのバグを修正しました(私のお気に入りのエディターであるgeanyでは、ファイルを保存すると、最初に一時ファイルを書き込んでから移動します理由はわかりませんが、再コンパイルウォッチが失われ、babelウォッチを再起動するまで再起動されないことがあります)

ここにリンクがあります: https://github.com/di-ninja/babel-watch-extra

1
Jo-Go

このように--watchを追加することで取得できました。

"scripts": {
    "build": "babel server.js --watch -d dist",
    "start": "npm run build && node dist/server.js"
  },

ドキュメントを参照してください: https://babeljs.io/docs/en/babel-cli

1
Deke