node.js - 文件更改时转译 ES6 并启动 Express 应用程序

标签 node.js npm build npm-scripts chokidar

我正在开发一个 Express 应用程序。该代码使用了 ES6 import 语句,因此需要通过 ES5 代码中的 Babel 进行转译,以便可以在 Node 上运行。 ES6源码存放在我的src目录,编译后的代码放在我的dest中目录。

我想要一个可以运行的 npm 命令来监视我的 src 中的任何更改目录,将项目转译为 dest ,然后重新启动 Express 应用。

下面是我到目前为止的解决方案(我运行 npm run server:watch )。它使用 chokidar-cli执行server:buildserver: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/

相关文章:

javascript - NPM 是否默认发布压缩?

build - 构建cmake项目时通过终端获取产品版本

http - bower 使用 http 而不是 https

node.js - nvm 在新的终端 session 中保留 "forgetting" Node

visual-studio - Visual Studio 在错误位置创建 bin/文件夹

ios - 生成时在xcode中获取错误-PhaseScriptExecution失败,退出代码非零

node.js - Heroku 在启动脚本中失败,但我的 package.json 中有一个标准的启动脚本

javascript - 如何将查询结果推送到node.js中的数组变量?

javascript - 使用 NPM 包和 Meteor.wrapAsync 的异步问题

node.js - mongodb:加密字段的唯一索引