Nodemon + babel несколько раз перезагружает сервер

В моем package.json у меня есть start-script, который я использую для своей среды разработки. Это выглядит так:

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

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

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

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

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

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

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


person Jonathan Nielsen    schedule 07.10.2016    source источник
comment
У меня такая же проблема на nodemon 1.11.0 БЕЗ Babel.   -  person Tony Gutierrez    schedule 25.10.2016


Ответы (6)


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

person Jonathan Nielsen    schedule 06.03.2017
comment
Добавлено --delay 2 или больше (в моем случае: 5): все равно перезагружаемся снова и снова. :( - person trungducng; 29.03.2019

Вы должны использовать babel-node в качестве исполнителя следующим образом:

nodemon ./index.js --exec babel-node
person chuyik    schedule 21.05.2017

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

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

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

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

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

person Amos47    schedule 29.06.2018

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

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

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

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

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

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

person DevTheJo    schedule 28.11.2018

Существует возможность создавать файлы с помощью 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"
  }
}

введите здесь описание изображения

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

person Konstantin Tarkus    schedule 17.09.2019

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

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

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

person Deke    schedule 24.09.2019