我正在开发一个 Express 应用程序。该代码使用了 ES6 import 语句,因此需要通过 ES5 代码中的 Babel 进行转译,以便可以在 Node 上运行。 ES6源码存放在我的src
目录,编译后的代码放在我的dest
中目录。
我想要一个可以运行的 npm 命令来监视我的 src
中的任何更改目录,将项目转译为 dest
,然后重新启动 Express 应用。
下面是我到目前为止的解决方案(我运行 npm run server:watch
)。它使用 chokidar-cli
执行server:build
和server:run
每当我的 src
中任何 js 文件发生更改时都会执行脚本目录。这工作得很好,只是当代码再次转译时 Express 应用程序不会死掉,所以当我尝试运行 server:watch
时,我收到“端口正在使用”异常。再次。
// package.json
"scripts": {
"server:clean": "rm -f dist/*",
"server:build": "npm run server:clean && ./node_modules/.bin/babel ./src --experimental --source-maps-inline -d ./dist",
"server:run": "nodemon dist/app.js --watch",
"server:watch": "chokidar 'src/*.js' -c 'npm run server:build && npm run server:run'"
}
我走的路正确吗?解决此类问题的最佳方案是什么?
(为了澄清起见,我正在谈论转译服务器端代码,因此 webpack 或任何其他模块 bundler 在这里都不合适)
最佳答案
nodemon
正在监视您的 dist 文件,并且永远不会终止。使用监视脚本,每次文件发生更改时,您都会启动 nodemon
的第二个实例,因此会出现“端口正在使用”错误。
您需要启动nodemon
一次,并在监视脚本运行时保持在后台运行。使用 https://github.com/mysticatea/npm-run-all 最容易完成此操作。 .
通过运行安装它:
npm install npm-run-all --save-dev
在命令行上。
然后您将脚本编辑为:
// package.json
"scripts": {
"server:clean": "rm -f dist/*",
"server:build": "npm run server:clean && ./node_modules/.bin/babel ./src --experimental --source-maps-inline -d ./dist",
"server:run": "nodemon dist/app.js --watch",
"server:watch": "chokidar 'src/*.js' -c 'npm run server:build'",
"server:dev": "run-p server:run server:watch"
}
然后,您只需在命令行上运行 npm run server:dev
即可通过 nodemon
启动您的服务器,并启动监视/重建过程,所有这一切都一劳永逸命令。
旁注:如果您在 Windows 上进行开发,则无法在脚本中使用单引号,必须使用双引号,并在 JSON 中使用 \"
转义.
关于node.js - 文件更改时转译 ES6 并启动 Express 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52269009/