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