我在 Heroku 上使用 babel-node 作为 ES6 语法,但在部署时遇到构建错误。它说"babel节点:未找到"。我已经尝试在本地计算机上进行全新安装,并且效果很好。Package.json:
{
"name": "secret",
"version": "0.0.0",
"private": true,
"scripts": {
"start": "./node_modules/.bin/babel-node ./bin/www"
},
"engines": {
"node": "7.5.0",
"npm": "5.0.3"
},
"dependencies": {
"babel-cli": "^6.24.1",
"babel-preset-es2015": "^6.24.1",
"babel-preset-stage-0": "^6.24.1",
...
}
}
感谢您的帮助! :)
2017-07-17T11:02:26.997876+00:00 heroku[web.1]: State changed from crashed to starting
2017-07-17T11:02:31.839278+00:00 heroku[web.1]: Starting process with command `npm start`
2017-07-17T11:02:38.074157+00:00 heroku[web.1]: State changed from starting to crashed
2017-07-17T11:02:38.062607+00:00 heroku[web.1]: Process exited with status 1
2017-07-17T11:02:37.865774+00:00 app[web.1]:
2017-07-17T11:02:37.865786+00:00 app[web.1]: > secret@0.0.0 start /app
2017-07-17T11:02:37.865787+00:00 app[web.1]: > babel-node ./bin/www
2017-07-17T11:02:37.865787+00:00 app[web.1]:
2017-07-17T11:02:37.936361+00:00 app[web.1]: sh: 1: babel-node: not found
2017-07-17T11:02:37.966452+00:00 app[web.1]: npm ERR! file sh
2017-07-17T11:02:37.966683+00:00 app[web.1]: npm ERR! code ELIFECYCLE
2017-07-17T11:02:37.966931+00:00 app[web.1]: npm ERR! errno ENOENT
2017-07-17T11:02:37.967106+00:00 app[web.1]: npm ERR! syscall spawn
2017-07-17T11:02:37.967287+00:00 app[web.1]: npm ERR! secret@0.0.0 start: `babel-node ./bin/www`
2017-07-17T11:02:37.967430+00:00 app[web.1]: npm ERR! spawn ENOENT
2017-07-17T11:02:37.967588+00:00 app[web.1]: npm ERR!
2017-07-17T11:02:37.967733+00:00 app[web.1]: npm ERR! Failed at the secret@0.0.0 start script.
2017-07-17T11:02:37.967873+00:00 app[web.1]: npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
2017-07-17T11:02:37.969151+00:00 app[web.1]:
2017-07-17T11:02:37.969374+00:00 app[web.1]: npm ERR! A complete log of this run can be found in:
2017-07-17T11:02:37.969484+00:00 app[web.1]: npm ERR! /app/.npm/_logs/2017-07-17T11_02_37_957Z-debug.log
2017-07-17T11:25:52.044791+00:00 heroku[web.1]: State changed from crashed to starting
2017-07-17T11:25:54.841341+00:00 heroku[web.1]: Starting process with command `npm start`
2017-07-17T11:25:57.407691+00:00 heroku[web.1]: Process exited with status 1
2017-07-17T11:25:57.413873+00:00 heroku[web.1]: State changed from starting to crashed
2017-07-17T11:25:57.310176+00:00 app[web.1]:
2017-07-17T11:25:57.310190+00:00 app[web.1]: > secret@0.0.0 start /app
2017-07-17T11:25:57.310191+00:00 app[web.1]: > babel-node ./bin/www
2017-07-17T11:25:57.310192+00:00 app[web.1]:
2017-07-17T11:25:57.316940+00:00 app[web.1]: sh: 1: babel-node: not found
2017-07-17T11:25:57.335019+00:00 app[web.1]: npm ERR! file sh
2017-07-17T11:25:57.335287+00:00 app[web.1]: npm ERR! code ELIFECYCLE
2017-07-17T11:25:57.335517+00:00 app[web.1]: npm ERR! errno ENOENT
2017-07-17T11:25:57.335735+00:00 app[web.1]: npm ERR! syscall spawn
2017-07-17T11:25:57.335933+00:00 app[web.1]: npm ERR! secret@0.0.0 start: `babel-node ./bin/www`
2017-07-17T11:25:57.336095+00:00 app[web.1]: npm ERR! spawn ENOENT
2017-07-17T11:25:57.336280+00:00 app[web.1]: npm ERR!
2017-07-17T11:25:57.336449+00:00 app[web.1]: npm ERR! Failed at the secret@0.0.0 start script.
2017-07-17T11:25:57.336614+00:00 app[web.1]: npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
2017-07-17T11:25:57.337985+00:00 app[web.1]:
2017-07-17T11:25:57.338232+00:00 app[web.1]: npm ERR! A complete log of this run can be found in:
2017-07-17T11:25:57.338379+00:00 app[web.1]: npm ERR! /app/.npm/_logs/2017-07-17T11_25_57_323Z-debug.log
babel-node
">不适合生产用途"。 这里有一个更相关的指南来使用@babel/cli
,@babel/core
和@babel/preset-env
。
babel 依赖项应该全部作为 devDependencies 安装,你应该在 Heroku 修剪 devDependencies 之前在运行build
脚本中转译你的代码。请参阅此指南
如果您将所有 es6 代码移动到应用程序顶层的src
等公共目录中,则可以创建一个构建脚本,将该目录中的所有内容转译到输出目录,如build
.
"build": "npm run clean && npm run build-babel",
"build-babel": "./node_modules/.bin/babel -d ./build ./src",
"clean": "rm -rf build && mkdir build",
在上面的示例中,build
脚本将由 Heroku 自动运行。clean
将创建一个新的构建目录,build-babel
将转译代码并将其放置在build
目录中。 完成此操作后,Heroku 将修剪devDependencies
,但您将不再需要 Babel。
当 Heroku 调用下面的start
时,它将运行您的转译代码。 您应该不再看到sh: 1: babel-node: not found
。
"scripts": {
"build": "npm run clean && npm run build-babel",
"build-babel": "./node_modules/.bin/babel -d ./build ./src",
"clean": "rm -rf build && mkdir build",
"start": "node ./build/bin/www"
},
一个潜在的陷阱,不要从start
脚本中调用build
。 如果你这样做,devDependencies将被修剪,你将得到以下内容
sh: 1: babel: not found
有点晚了,但我认为你缺少的是:
步骤(1(:在终端中npm install --save babel-cli babel-preset-env
关于步骤 1 的说明:不要保存到 dev,因为这需要您设置 NPM_CONFIG_PRODUCTION=false
步骤(2(:您不会在没有添加 babel 样板和/或使用 babelrc 文件的情况下将任何内容编译到 babel。最简单的方法是在您的主应用程序文件夹中创建一个 .babelrc 文件,即。与你的 package.json 所在的相同,并输入以下内容:
{
"presets": ["env"]
}
关于第 2 步的注意事项:使用 env 预设时,您不需要 babel-preset-es2015 等
步骤(3(:您现在可以使用 babel-node 运行代码,因此在您的情况下执行启动脚本,即。./node_modules/.bin/babel-node ./bin/www
如果您需要进一步的指导来理解预设逻辑,我建议您通读 NPM 模块:https://www.npmjs.com/package/babel-preset-env
此外,我建议使用像pm2这样的进程管理器。这允许您的节点实例在崩溃时保持活动状态。永远的模块曾经这样做,但pm2要好得多。下面是 package.json 中的启动脚本示例:
"脚本":{ "start": "node ./node_modules/.bin/pm2 start main.json --attach --env production" }
Procfile(注意,我正在使用nginx,但只有npm启动就可以正常工作(:
web: bin/start-nginx npm start
worker: node ./node_modules/.bin/pm2 start worker.json --attach
这将是你的 main.json,带有使用 babel-node 的参数(注意,将实例保持在 1 并且不要在 Heroku 中的网络测功机上分叉(:
main.json:
{
"name": "the_awesome",
"script": "app.js",
"instances": 1,
"exec_mode": "cluster"
}
worker.json:
{
"name": "worker",
"script": "/app/lib/worker.js"
}
(4( 如果你在集群模式下使用 pm2.js请向你的应用.js和 worker 添加一个 require('babel-register'( 钩子。如果你在集群模式下使用 pm2,或者只是不使用 pm2,那么你可以直接使用 babel-node 来运行你的 .js 或 es6 文件
最后,要检查是否真的安装了 babel-node,您可以执行以下操作:
heroku run bash -a {name of your app}
ls ./node_modules/.bin //babel-node should be present
祝你好运!