如何在 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 使用nodemon
和babel
的方式。
请注意,运行--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 和浏览器同步?