如何在 npm 脚本中使用 nodemon 来构建和启动脚本?

Posted

技术标签:

【中文标题】如何在 npm 脚本中使用 nodemon 来构建和启动脚本?【英文标题】:How to use nodemon in npm scripts to build and start scripts? 【发布时间】:2016-08-18 03:50:01 【问题描述】:
"scripts": 
  "build": "babel src -d lib",
  "start": "node --use_strict ./lib/index.js",
  "watch": "nodemon lib/index.js --exec npm run build"

使用命令npm run watch 会导致运行以下错误命令:[nodemon] starting "npm lib/index.js run build"

如何编写一个 nodemon 命令,在重新加载时,使用 babel 转译代码并重新加载代码?

【问题讨论】:

【参考方案1】:

您可以简单地使用babel-node 运行您的代码以避免显式转译。

$ nodemon lib/index.js --exec babel-node --presets=es2015,stage-2

这似乎是this is the recommended 使用nodemonbabel 的方式。

请注意,运行--exec 可能在远程运行development 环境时会产生意想不到的副作用localhost

【讨论】:

运行 babel-node 需要安装什么包? NPM 说 babel-node 不在存储库中,即使我已经通过 npm 安装了 babel-cli,运行你给定的命令说 babel-node 不可用。 babel-cli 是正确的。您应该全局安装它或将执行路径更改为./node_modules/.bin/babel-node 我在项目中全局和本地安装了babel-cli,但出现以下错误。 i.imgur.com/UwXaPTz.jpg 您正尝试将 babel-node 作为 npm 脚本运行,就像在 package.json 中声明的那样。您可以找到一个工作示例here。 哎呀,那是我的错误,对不起。我已经确定了答案。【参考方案2】:
  "scripts": 
    "build": "babel src -d lib",
    "start": "node --use_strict ./lib/index.js",
    "watch": "nodemon --exec \"npm run build && node lib/index.js\" -e js --ignore lib/"
  

然后运行npm run watch。之后,每次修改源代码(.js文件)时,nodemon都会重新构建项目并重启服务器。

--exec 指定您希望 nodemon 在文件更改时执行哪些非节点脚本(也适用于上述节点脚本 node lib/index.js)。

-e 指定您希望 nodemon 监视的文件扩展名。

--ignore 指定您希望 nodemon 忽略的文件/目录。此选项对于解决此问题至关重要,因为如果您不指定忽略此 lib/ 文件夹,nodemon 将无限重启,因为 lib/ 中的编译文件也是 .js 文件。

【讨论】:

【参考方案3】:

你可以有两个 nodemon,一个用来编译,另一个用来运行你的代码。在 package.json 你可以这样做:

"scripts": 
    "serve": "nodemon --watch dist/ ./dist/index.js",
    "build" : "nodemon --watch src/ --exec babel ./src --out-dir ./dist --source-maps --copy-files"
  ,

【讨论】:

【参考方案4】:

有一个选项可以在“监视”模式下使用 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"
  

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

【讨论】:

【参考方案5】:

更好的选择是不使用全局安装,而是使用本地安装的包。这也将有助于自动化构建,这些构建可能按照 12 因素应用程序设计设置为与本地计算机相同。

"scripts": 
"watch": "node ./node_modules/nodemon/bin/nodemon.js"

【讨论】:

你能解释一下吗? 不要在cli中全局使用nodemon,而是使用上面的代码,您可以使用--save或--save-dev调用本地安装的包,node ./node_modules/nodemon/bin/nodemon .js 在 npm 脚本或 cli cmd 中。还要添加您需要传递的任何参数。基本上不是使用全局标识符调用它,而是直接从解决方案结构中调用。这有助于您的团队以及他们都将使用相同的版本,如果软件包在一段时间内全局安装在多个工作站上,则版本很可能会有所不同。【参考方案6】:
"scripts": 
  "build": "babel src -d lib",
  "start": "nodemon --exec babel-node lib/index.js",
  "serve": "npm run build && node lib/index.js"

Serve 用于生产,使用 npm start 你要做的就是先编译然后运行 ​​nodemon。

【讨论】:

以上是关于如何在 npm 脚本中使用 nodemon 来构建和启动脚本?的主要内容,如果未能解决你的问题,请参考以下文章

Nodemon 无法在 Docker 上使用 package.json 中的 npm 脚本

是否可以在 Express 应用程序中使用一个 npm 脚本启动 nodemon 和浏览器同步?

监视 nodemon js 或 npm 中的新文件创建事件

npm脚本中的nodemon多次触发

在 npm 脚本中运行 2 个命令(nodemon && sass --watch)

如何使用 nodemon 进行 linting?