20

When I run heroku local or when I just do npm start locally, my app builds and runs fine. However when I deploy to heroku, the app crashes saying it cannot find babel-node.

Here is the log output:

2016-04-21T22:20:44.320025+00:00 heroku[api]: Deploy 5d9a9da by eagsalazar@gmail.com
2016-04-21T22:20:44.320084+00:00 heroku[api]: Release v9 created by eagsalazar@gmail.com
2016-04-21T22:20:44.542062+00:00 heroku[slug-compiler]: Slug compilation started
2016-04-21T22:20:44.542069+00:00 heroku[slug-compiler]: Slug compilation finished
2016-04-21T22:20:44.501025+00:00 heroku[web.1]: State changed from crashed to starting
2016-04-21T22:20:46.278065+00:00 heroku[web.1]: Starting process with command `npm start`
2016-04-21T22:20:50.467407+00:00 app[web.1]:
2016-04-21T22:20:50.467434+00:00 app[web.1]: > qc-server@1.0.0 start /app
2016-04-21T22:20:50.467435+00:00 app[web.1]: > babel-node index.js
2016-04-21T22:20:50.467436+00:00 app[web.1]:
2016-04-21T22:20:50.479490+00:00 app[web.1]: sh: 1: babel-node: not found
2016-04-21T22:20:50.521936+00:00 app[web.1]:
2016-04-21T22:20:50.538822+00:00 app[web.1]: npm ERR! Linux 3.13.0-79-generic
2016-04-21T22:20:50.539334+00:00 app[web.1]: npm ERR! argv "/app/.heroku/node/bin/node" "/app/.heroku/node/bin/npm" "start"
2016-04-21T22:20:50.539595+00:00 app[web.1]: npm ERR! node v5.10.1
2016-04-21T22:20:50.555119+00:00 app[web.1]: npm ERR! npm  v3.8.3
2016-04-21T22:20:50.555339+00:00 app[web.1]: npm ERR! file sh
2016-04-21T22:20:50.555549+00:00 app[web.1]: npm ERR! code ELIFECYCLE
2016-04-21T22:20:50.555769+00:00 app[web.1]: npm ERR! errno ENOENT
2016-04-21T22:20:50.555965+00:00 app[web.1]: npm ERR! syscall spawn
2016-04-21T22:20:50.556142+00:00 app[web.1]: npm ERR! qc-server@1.0.0 start: `babel-node index.js`
2016-04-21T22:20:50.556305+00:00 app[web.1]: npm ERR! spawn ENOENT
2016-04-21T22:20:50.556488+00:00 app[web.1]: npm ERR!
2016-04-21T22:20:50.556666+00:00 app[web.1]: npm ERR! Failed at the qc-server@1.0.0 start script 'babel-node index.js'.
2016-04-21T22:20:50.556854+00:00 app[web.1]: npm ERR! Make sure you have the latest version of node.js and npm installed.
2016-04-21T22:20:50.557017+00:00 app[web.1]: npm ERR! If you do, this is most likely a problem with the qc-server package,
2016-04-21T22:20:50.557175+00:00 app[web.1]: npm ERR! not with npm itself.
2016-04-21T22:20:50.557343+00:00 app[web.1]: npm ERR! Tell the author that this fails on your system:
2016-04-21T22:20:50.557564+00:00 app[web.1]: npm ERR!     babel-node index.js
2016-04-21T22:20:50.557741+00:00 app[web.1]: npm ERR! You can get information on how to open an issue for this project with:
2016-04-21T22:20:50.557916+00:00 app[web.1]: npm ERR!     npm bugs qc-server
2016-04-21T22:20:50.558110+00:00 app[web.1]: npm ERR! Or if that isn't available, you can get their info via:
2016-04-21T22:20:50.558306+00:00 app[web.1]: npm ERR!     npm owner ls qc-server
2016-04-21T22:20:50.558492+00:00 app[web.1]: npm ERR! There is likely additional logging output above.
2016-04-21T22:20:50.563859+00:00 app[web.1]:
2016-04-21T22:20:50.567790+00:00 app[web.1]: npm ERR! Please include the following file with any support request:
2016-04-21T22:20:50.568004+00:00 app[web.1]: npm ERR!     /app/npm-debug.log
2016-04-21T22:20:51.824822+00:00 heroku[web.1]: State changed from starting to crashed
2016-04-21T22:20:51.808246+00:00 heroku[web.1]: Process exited with status 1

My package.json:

{
  "name": "qc-server",
  "version": "1.0.0",
  "description": "xxxx",
  "main": "index.js",
  "scripts": {
    "test": "mocha --compilers js:babel-core/register --require ./test/test_helper.js 'test/**/*.js'",
    "test:watch": "npm run test -- --watch -G",
    "start": "babel-node index.js"
  },
  "babel": {
    "presets": [
      "es2015"
    ]
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "babel-cli": "^6.6.0",
    "babel-core": "^6.6.0",
    "babel-eslint": "^5.0.0",
    "babel-preset-es2015": "^6.6.0",
    "chai": "^3.5.0",
    "chai-immutable": "^1.5.3",
    "eslint": "^2.2.0",
    "eslint-config-airbnb": "^6.0.2",
    "eslint-plugin-react": "^4.1.0",
    "mocha": "^2.4.5"
  },
  "dependencies": {
    "express": "^4.13.4",
    "immutable": "^3.7.6",
    "node-uuid": "^1.4.7",
    "redux": "^3.3.1",
    "socket.io": "^1.4.5"
  }
}

Anyone have suggestions?

Jan Trienes
  • 2,501
  • 1
  • 16
  • 28
eagspoo
  • 2,095
  • 3
  • 22
  • 31
  • Also had same problem using elasticbeanstalk which I tried out thinking maybe it was just some heroku quirk. – eagspoo Apr 21 '16 at 22:31

3 Answers3

28

You have to include the dependency in you package.json so it will install it when you deploy.

$ npm install babel-cli -S

Than you have to change you start command to be like:

"start": "babel-node index.js"

See here for more info on deploying babel on heroku.com.

Warning: using babel-node is not recommended in production

sf77
  • 631
  • 1
  • 5
  • 6
Ricardo Souza
  • 16,030
  • 6
  • 37
  • 69
  • 2
    Changing the start command isn't actually required but you do need to put babel in dependencies, not devDependencies. – eagspoo Apr 21 '16 at 22:49
  • 1
    [Heroku will not install devDependencies](https://devcenter.heroku.com/articles/nodejs-support#devdependencies) by default – Jonathan Morales Vélez Dec 14 '16 at 14:29
  • 2
    You should not use babel-node on production, as advised by the Babel team: https://babeljs.io/docs/usage/cli/#babel-node – vcarel Dec 15 '16 at 16:31
23

I got the same issue, but I think set NPM_CONFIG_PRODUCTION=false to install devDependencies will be better. I used below command:

heroku config:set NPM_CONFIG_PRODUCTION=false
Toan Tran
  • 1,937
  • 1
  • 24
  • 37
  • 1
    +1 I think this is a better solution than installing babel-node, nodemon, etc... as regular dependencies – sonlexqt Nov 13 '18 at 17:06
  • 1
    Does this have a negative impact on the app's performance? What are the consequences of setting `NPM_CONFIG_PRODUCTION` to `false` if one is trying to build a production system? UPDATE: Looks like the Update below addresses this. – tim.rohrer Nov 25 '20 at 17:31
6

Specifically, include the necessary dependency under 'dependencies' and not 'devDependencies' in your 'package.json file'. This is because Heroku prunes (removes) your 'devDependencies' once it completes its build process, leaving only the 'dependencies', to keep the app as lean as possible.

This causes errors if you've built your NodeJS app using ES6 modules and included the necessary dependencies under 'devDependencies' instead of 'dependencies', namely the '@babel/' family of dependencies.

Update

You should always build your NodeJS App before you deploy it so that you are always running the production build in the live environment which executes much faster with fewer resources.

Wachaga Mwaura
  • 3,310
  • 3
  • 28
  • 31