Nodemon + babel 多次重启服务器

Nodemon + babel restart the server multiple times

在我的 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 按预期重新启动一次。

我不知道如何解决这个问题,甚至不知道去哪里寻找答案。我试过 google 它。我一直在 github 访问包的错误部分...(也许我只是不擅长谷歌搜索)。
这是我为同一问题找到的唯一 link,但它似乎没有答案:Nodemon runs multiple times on save when using babel.
我还是尝试了他的脚本 NODE_PATH=src nodemon src --exec babel -w src/ --out-dir build/ --source-maps 但同样的事情发生了,重新启动两次或三次。

就像@Connorelsea 在上面 link 提供的答案的评论部分所说的那样,如果我添加 --delay 2.5 它只会重启一次。

我在想,也许当我在监视的文件中点击保存时,nodemon 立即重新启动并且 babel 开始转译。当 babel 完成后,它会保存一堆 om 转译文件,并且 nodemon 再次重新启动,因为对 src/-folder 进行了更改。但是我不知道如何调试它。

希望大家帮帮我!

**** 编辑 ****

刚找到这个https://github.com/remy/nodemon/issues/508,但他们唯一的解决办法是"upgrade nodemon"。我现在有最新的 1.11.0。

所以,现在几个月后我发现了问题所在。似乎服务器只是在我保存时重新启动一次,而在文件更新后几秒钟后 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 构建,然后并行启动了一个启用了 --skip-initial-build 选项和 nodemon 的 babel watch,

但最后,我发现更好的解决方法是制作我自己的 babel watcher,它具有以下优点:

  • 考虑删除和其他事件,保持一切同步

  • 允许我添加@compileDependencies 注释系统(参见https://github.com/kentcdodds/babel-plugin-preval/issues/19

  • 修复官方@babel/cli watcher 中使用 chokidar 的 awaitWriteFinish 选项导致的 watching 错误(使用我最喜欢的编辑器 geany,当我保存文件时,它先写一个临时文件,然后将它移动到目标,我不知道为什么但有时重新编译监视只是丢失并且在我重新启动 babel watch 之前再也不会触发)

这里是 link: https://github.com/di-ninja/babel-watch-extra

有一个选项可以在 "watch" 模式下使用 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"
  }
}

此示例取自 GitHub 上的 GraphQL API Examples 存储库。

我可以通过像这样添加 --watch 来获得它。

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

查看文档:https://babeljs.io/docs/en/babel-cli