javascript - heroku 在构建依赖项时不使用 babel 编译代码

标签 javascript node.js heroku babeljs

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/

相关文章:

javascript - 如何修复我的代码中的 getJSON 方法错误?

javascript - 使用 Google Earth API 和 KML 来获取 kml 并嵌入为在线 3D map

javascript - 当div覆盖另一个div时模拟颜色变化

javascript - 检查是否有 next() 函数表达式

node.js - ACL 最佳实践,在用户对象中存储角色,还是单独的表/集合?

node.js - 使用服务帐户将 Firebase 应用程序部署到 Heroku(使用 dotenv 的环境变量)

ruby-on-rails - 名称错误 : uninitialized constant Smtpapi

javascript - 我不知道为什么添加 JavaScript 计时器会破坏我的代码。昨天 44 次失败的 github 提交

javascript - 如何从 Google Forms 弹出下拉列表中选择一个选项 Puppeteer NodeJS

node.js - Heroku process.env 未定义