Heroku 正在成功构建我的应用程序,但是当我转到部署的 url 时,我收到应用程序错误,当我检查日志时,我发现它无法读取它尝试在 yarn start< 上运行的未编译的服务器代码
.
与此不同stack post我有一个 procfile 并且我已经测试了我的 procfile 并且它工作正常。
我已经成功地将问题范围缩小到heroku无法使用babel来编译服务器代码。
这是运行heroku messages --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构建日志是在依赖项
中运行的。 (与他们的帖子不同,我的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
的服务器代码未转译。
当我打开部署链接时,它输出我收到一个错误,其中包含我在上面发布的日志(意外标识符)
我唯一能做的就是在推送到 Heroku 之前转译我的代码,并让 heroku 运行下一个构建
。
我的依赖项:
"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 来转译我的代码?
最佳答案
您的依赖项看起来不错,请将此脚本添加到您的 package.json
"heroku-prebuild": "rm -rf node_modules",
关于javascript - heroku 在构建依赖项时不使用 babel 编译代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54717988/