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, сервер перезапустится. Но вот моя проблема, он перезапускается 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 перезапустится один раз, как и ожидалось.

Я понятия не имею, как решить это, или даже где искать ответы. Я пытался гуглить. Я посещал раздел об ошибках в пакете на github... (Может быть, я просто отстой в поиске).
Вот единственная ссылка, которую я нашел для той же проблемы, но на нее, похоже, нет ответа: Nodemon запускается несколько раз при сохранении при использовании babel.
Я все равно попробовал его сценарий NODE_PATH=src nodemon src --exec babel -w src/ --out-dir build/ --source-maps но то же самое произошло, перезапуская два или три раза.

Как @Connorelsea сказал в разделе комментариев ответа, приведенного в ссылке выше, если я добавлю --delay 2.5 перезапуск только один раз.

Я думаю, может быть, когда я нажму "Сохранить" в наблюдаемом файле, нодмон перезапускается мгновенно, и бабел начинает переноситься. Когда babel завершит работу, он сохранит кучу переданных файлов, и nodemon перезапустится еще раз, так как были внесены изменения в папку src /. Но я не знаю, как это отладить.

Надеюсь, вы, ребята, можете мне помочь!

**** РЕДАКТИРОВАТЬ ****

Только что нашел этот https://github.com/remy/nodemon/issues/508 но единственное решение, которое у них есть, это "обновить nodemon". У меня есть последний, который является 1.11.0 в это время.

4 ответа

Решение

Итак, через пару месяцев я понял, что не так. Похоже, сервер просто перезагружается один раз, когда я сохраняю, и еще раз, когда babel преобразовал код пару секунд спустя, так как файлы обновляются. Так было в пакете babel-node это дало мне это нежелательное поведение. Работает с nodemon задержка 2 секунды --delay 2 или больше.

Вы должны использовать babel-node как исполнитель, как это:

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

Так что на случай, если кто-то споткнется об этом, как я.

Хотя задержка работает, она работает, потому что ваша сборка обычно занимает менее 2 с.

Это может привести к тому, что оно будет ненадежным или просто займет больше времени, чем нужно.

Правильное решение - фактически игнорировать выходной каталог или файл в nodemon.

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

Существует возможность создавать файлы с помощью Babel в режиме "просмотра", позволяя Nodemon отслеживать только папку "build" и перезапускать приложение при изменении скомпилированного вывода.

{
  "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"
  }
}

Этот пример взят из GraphQL API Examples репозиторий на GitHub.

Сначала я загружал первую сборку Babel, затем параллельно запускал часы Babel с --skip-initial-build опция включена и nodemon,

Но, наконец, лучший обходной путь, который я нашел, состоит в том, чтобы сделать мой собственный наблюдатель вавилона, который имеет следующие преимущества:

  • учитывать удаление и другие события, сохраняя все синхронизированным

  • разрешить мне добавить систему аннотаций @compileDependencies (см. https://github.com/kentcdodds/babel-plugin-preval/issues/19)

  • исправить ошибку просмотра, которая была вызвана awaitWriteFinish опция chokidar используется в оффициальном наблюдателе @babel/cli (с моим любимым редактором geany, когда я сохраняю файл, он сначала записывает временный файл, а затем перемещает его в dest, и я не знаю почему, но иногда перекомпилирую просмотр был просто утерян и больше никогда не сработал, пока я не перезапущу вавилонские часы)

вот ссылка: https://github.com/di-ninja/babel-watch-extra

Я смог получить это, добавив --watch как это.

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

см. документы: https://babeljs.io/docs/en/babel-cli

Другие вопросы по тегам