【发布时间】:2019-07-10 02:35:47
【问题描述】:
Heroku 正在成功构建我的应用程序,但是当我转到已部署的 url 时,我收到一个应用程序错误,当我检查日志时,我发现它无法读取它试图在 yarn start 上运行的未编译服务器代码。
与stack post 不同,我有一个 procfile,我已经测试了我的 procfile,它工作正常。
我已成功将问题缩小到 heroku 无法使用 babel 编译服务器代码。
这是运行heroku logs --tail时的日志错误
2019-02-15T22:28:03.169864+00:00 app[web.1]: yarn run v1.14.0
2019-02-15T22:28:03.298039+00:00 app[web.1]: $ NODE_ENV=production node compiled/server/server.js
2019-02-15T22:28:03.410030+00:00 app[web.1]: /app/compiled/server/server.js:1
2019-02-15T22:28:03.410035+00:00 app[web.1]: (function (exports, require, module, __filename, __dirname) { import express from 'express';
2019-02-15T22:28:03.410037+00:00 app[web.1]: ^^^^^^^
2019-02-15T22:28:03.410039+00:00 app[web.1]:
2019-02-15T22:28:03.410041+00:00 app[web.1]: SyntaxError: Unexpected identifier
2019-02-15T22:28:03.410043+00:00 app[web.1]: at new Script (vm.js:79:7)
2019-02-15T22:28:03.410045+00:00 app[web.1]: at createScript (vm.js:251:10)
2019-02-15T22:28:03.410047+00:00 app[web.1]: at Object.runInThisContext (vm.js:303:10)
2019-02-15T22:28:03.410049+00:00 app[web.1]: at Module._compile (internal/modules/cjs/loader.js:657:28)
2019-02-15T22:28:03.410051+00:00 app[web.1]: at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10)
2019-02-15T22:28:03.410052+00:00 app[web.1]: at Module.load (internal/modules/cjs/loader.js:599:32)
2019-02-15T22:28:03.410054+00:00 app[web.1]: at tryModuleLoad (internal/modules/cjs/loader.js:538:12)
2019-02-15T22:28:03.410056+00:00 app[web.1]: at Function.Module._load (internal/modules/cjs/loader.js:530:3)
2019-02-15T22:28:03.410058+00:00 app[web.1]: at Function.Module.runMain (internal/modules/cjs/loader.js:742:12)
2019-02-15T22:28:03.410060+00:00 app[web.1]: at startup (internal/bootstrap/node.js:283:19)
2019-02-15T22:28:03.498430+00:00 heroku[web.1]: Process exited with status 1
这是我的 npm 脚本:
"scripts": {
"dev": "./node_modules/.bin/nodemon.js server/server.js --watch server --exec babel-node",
"build": "yarn build:next && yarn build:server",
"build:next": "next build",
"build:server": "./node_modules/.bin/babel server -d compiled/server",
"start": "NODE_ENV=production node compiled/server/server.js",
"heroku-postbuild": "yarn build && cat compiled/server/server.js"
},
请注意,我将cat 添加到heroku-postbuild 以便我可以确认服务器没有被转译(见下文)。
遵循以下帖子的建议:
package.json start script, babel-node: not found on heroku deploy
babel-node is not getting installed on Heroku
heroku failed at the build script but heroku local web is fine
我已将我所有的 babel 依赖项从 devDependencies 移至依赖项。以下 heroku 构建日志是在 dependencies 中运行的。 (与他们的帖子不同,我的 heroku 构建运行成功,没有任何警告说它找不到 babel 依赖项。
Heroku 构建日志:
orpheus@Ryan:~/code/oip/nextjs-oip-hdmw$ git push heroku master
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 354 bytes | 354.00 KiB/s, done.
Total 3 (delta 2), reused 0 (delta 0)
remote: Compressing source files... done.
remote: Building source:
remote:
remote: -----> Node.js app detected
remote:
remote: -----> Creating runtime environment
remote:
remote: NPM_CONFIG_LOGLEVEL=error
remote: NODE_ENV=production
remote: NODE_MODULES_CACHE=true
remote: NODE_VERBOSE=false
remote:
remote: -----> Installing binaries
remote: engines.node (package.json): ^10.14.2
remote: engines.npm (package.json): unspecified (use default)
remote: engines.yarn (package.json): ^1.12.3
remote:
remote: Resolving node version ^10.14.2...
remote: Downloading and installing node 10.15.1...
remote: Using default npm version: 6.4.1
remote: Resolving yarn version ^1.12.3...
remote: Downloading and installing yarn (1.14.0)...
remote: Installed yarn 1.14.0
remote:
remote: -----> Restoring cache
remote: - node_modules
remote:
remote: -----> Building dependencies
remote: Installing node modules (yarn.lock)
remote: yarn install v1.14.0
remote: [1/4] Resolving packages...
remote: success Already up-to-date.
remote: Done in 1.78s.
remote: Detected both "build" and "heroku-postbuild" scripts
remote: Running heroku-postbuild (yarn)
remote: yarn run v1.14.0
remote: $ yarn build && cat compiled/server/server.js
remote: $ yarn build:next && yarn build:server
remote: $ next build
remote: [10:25:50 PM] Compiling client
remote: [10:25:51 PM] Compiling server
remote: > Using external babel configuration
remote: > Location: "/tmp/build_1571297117a8f31e1fa30a1e57c004ff/.babelrc"
remote: [10:26:01 PM] Compiled server in 10s
remote: [10:26:11 PM] Compiled client in 21s
remote: $ ./node_modules/.bin/babel server -d compiled/server
remote: Successfully compiled 2 files with Babel.
remote: import express from 'express';
remote: import next from 'next';
remote: import path from 'path';
remote: import helmet from 'helmet';
remote:
remote: require('dotenv').config();
remote:
remote: import logger from './logs';
remote:
remote: var _require = require(path.resolve('./', 'lib/api/getRootUrl')),
remote: getRootUrl = _require.getRootUrl;
remote:
remote: var dev = process.env.NODE_ENV !== 'production';
remote: var port = process.env.PORT || 7000;
remote: var ROOT_URL = getRootUrl();
remote: var app = next({
remote: dev: dev
remote: });
remote: var handle = app.getRequestHandler();
remote: var URL_MAP = {
remote: // example URL_MAP
remote: '/load': '/public/load'
remote: };
remote: app.prepare().then(function () {
remote: var server = express();
remote: server.use(helmet());
remote:
remote: if (!dev) {
remote: server.set('trust proxy', 1);
remote: }
remote:
remote: server.get('*', function (req, res) {
remote: var url = URL_MAP[req.path];
remote:
remote: if (url) {
remote: var query = req.query.query;
remote: app.render(req, res, url, query);
remote: } else {
remote: handle(req, res);
remote: }
remote: });
remote: server.listen(port, function (err) {
remote: if (err) throw err;
remote: logger.info("> Ready on ".concat(ROOT_URL));
remote: });
remote: });Done in 24.59s.
remote:
remote: -----> Caching build
remote: - node_modules
remote:
remote: -----> Pruning devDependencies
remote: yarn install v1.14.0
remote: [1/4] Resolving packages...
remote: [2/4] Fetching packages...
remote: info fsevents@1.2.7: The platform "linux" is incompatible with this module.
remote: info "fsevents@1.2.7" is an optional dependency and failed compatibility check. Excluding it from installation.
remote: [3/4] Linking dependencies...
remote: warning " > babel-jest@23.6.0" has unmet peer dependency "babel-core@^6.0.0 || ^7.0.0-0".
remote: warning "next-images > file-loader@3.0.1" has unmet peer dependency "webpack@^4.0.0".
remote: warning "next-images > url-loader@1.1.2" has unmet peer dependency "webpack@^3.0.0 || ^4.0.0".
remote: [4/4] Building fresh packages...
remote: warning Ignored scripts due to flag.
remote: Done in 58.13s.
remote:
remote: -----> Build succeeded!
remote: ! Unmet dependencies don't fail yarn install but may cause runtime issues
remote: https://github.com/npm/npm/issues/7494
remote:
remote:
remote: -----> Opting in to new default build script behavior
remote: You have set "heroku-run-build-script"=true in your package.json
remote: Your app will be unaffected by the change on March 11, 2019
remote:
remote: -----> Discovering process types
remote: Procfile declares types -> web
remote:
remote: -----> Compressing...
remote: Done: 130.6M
remote: -----> Launching...
remote: Released v21
remote: https://limitless-thicket-16836.herokuapp.com/ deployed to Heroku
remote:
remote: Verifying deploy... done.
To https://git.heroku.com/limitless-thicket-16836.git
441f024..97d87ef master -> master
这两行之后:
remote: $ ./node_modules/.bin/babel server -d compiled/server
remote: Successfully compiled 2 files with Babel.
您可以看到cat'd 服务器代码未转译。
当我打开部署链接时,它输出我已经在上面发布的日志出现错误(意外标识符)
我唯一能做的就是在推送到 Heroku 之前转译我的代码,然后让 heroku 运行 next build。
我的依赖:
"dependencies": {
"@babel/cli": "^7.2.3",
"@babel/core": "^7.2.2",
"@babel/node": "^7.2.2",
"@babel/preset-env": "^7.2.3",
"babel-eslint": "^10.0.1",
"babel-jest": "^23.6.0",
...
}
我错过了什么?如何让 Heroku 正确使用 babel 转译我的代码?
【问题讨论】:
标签: javascript node.js heroku babeljs