How to run Node.js app with ES6 features enabled?
Solution 1
Add the babel-cli
and babel-preset-es2015
(aka ES6) dependencies to your app's package.json file and define a start
script:
{
"dependencies": {
"babel-cli": "^6.0.0",
"babel-preset-es2015": "^6.0.0"
},
"scripts": {
"start": "babel-node --presets es2015 app.js"
}
}
Then you can simply execute the following command to run your app:
npm start
If you ever decide to stop using Babel (e.g. once Node.js supports all ES6 features), you can just remove it from package.json:
{
"dependencies": {},
"scripts": {
"start": "node app.js"
}
}
One benefit of this is that the command to run your app remains the same, which helps if you are working with other developers.
Solution 2
How configure node.js app with es6 support and server reload on file change.
I.Configuration steps ( creating project from the scratch ):
1.Go in terminal to Your project main directory
npm init
//create package.json for project
2.Install dependencies
npm install --save-dev babel
npm install --save-dev babel-cli
npm install --save-dev babel-preset-es2015
npm install --save-dev babel-preset-stage-0 //*1
npm install --save-dev nodemon
1 - it can be also stage-1 or 2, it depends what features of es We want to use
3.We should have in package.json file something like that ( for sure package version will be different but it is ok ):
"devDependencies": {
"babel": "^6.5.2",
"babel-cli": "^6.16.0",
"babel-preset-es2015": "^6.16.0",
"babel-preset-stage-0": "^6.16.0",
"nodemon": "^1.11.0"
}
4.Create .babelrc file in root project directory ( there is package.json file )
{
"presets": ["es2015", "stage-0"]
}
5.Create two directories:
src - here is working directory with files writen in es6
dist - here files will compile to es5 using babel
Your project root directory should look like this:
- project
- src
- index.js //main project file
- dist
- package.json
- .babelrc
- src
7.Add to package.json needed commands:
"scripts": {
"watch": "babel -w src/ -d dist/",
"build": "babel src/ -d dist/",
"serve": "babel -w src/ -d dist/ | nodemon --watch dist",
"test": "echo \"Error: no test specified\" && exit 1"
}
8.Available commands:
npm run watch
//starts watch watch changes in src directory and compiles in to dist
npm run build
//compiles files from src directory to dist
npm run serve
//it is doing watch + start node server, on every file change it will restart node server using nodemon which is watching dist directory changes
9.Final notes
- Server will run dist/index.js file as main file.
- File dist/index.js will be compiled from src/index.js so there should be main file of project.
- dist directory should be added to ignore by git ( but not ignore it for npm if it will be a node package )
10.Run server and start creating app in src directory.
npm run serve
II. Easier way ( ready to use boilerplate )
If it is too many points for You then full woking boilerplate is available on github - https://github.com/maciejsikora/node-express-babel-boilerplate.
Solution 3
You can use node with --harmony flag to run script with es6 features
Solution 4
node -r babel-register scripts.js
This is the best solution
npx babel-node scripts.js
!Babel node doesn't work well in case of exit process and kexec
package also doesn't help in this case (as I tried)
In both cases you need to use .babelrc
which should describe presets and plugins for your app.
npx
is using only for execution of libraries which are not installed with npm
or yarn
. Otherwise you need to npm i -g babel-cli
and then babel-node script.js
Solution 5
you need to install babel-register
and babel-preset-es2015
preset Which used into babel-register
options to Enabled convert ES6
to ES5
on-the-fly transpilation
npm install babel-register
npm install babel-preset-es2015
your run.js file:
// require babel-register and set Babel presets options to es2015
require('babel-register')({
presets: [ 'es2015' ]
});
require("./app.js6");
Notice: Now you does not need .babelrc
file to set Babel presets
options As we setting it with require
method
Related videos on Youtube
maiermic
Updated on July 05, 2022Comments
-
maiermic almost 2 years
I use the require hook of BabelJS (formerly named 6to5) to run node apps with es6features:
// run.js require("babel/register"); require("./app.js6");
I call
node run.js
to run my app.js6. I need to install BabelJS and provide a run.js for each project I'd like to use es6features. I would prefer a call likenodejs6 app.js6
. How can I achieve this system independently (Unix and Windows)?-
Jahed about 9 yearsHave you considered using io.js instead of NodeJS+Babel? iojs.org/en/index.html
-
maiermic about 9 yearsI didn't know io.js. Looks great, but unlike BabelJS it doesn't support rest arguments.
-
Jahed about 9 yearsRight. Well keep an eye on it, it's moving fast unlike NodeJS so I'm sure it'll be supported soon.
-
Felix Kling about 9 yearsAre you looking for
babel-node
? babeljs.io/docs/usage/cli/#babel-node -
aceofspades over 7 yearsMight want to check out npmjs.com/package/babel-register-cli
-
burntsugar over 4 yearsSimple solution successfull with node 13.5, express 6.13.4 timonweb.com/tutorials/…
-
-
maiermic about 9 yearsNode with --harmony flag doesn't support rest arguments. A feature that is supported by BabelJS and that I'd like to use.
-
Phil over 8 yearsIt should be noted that the babel docs explicitly warn against using babel-node in production.
-
Green over 8 yearsWhat about
nodemon
or others with your settings? Are you really reload server manually every time you make changes to files while developing? -
WitVault over 7 yearsIt has some warning regarding production use babeljs.io/docs/setup/#installation Not meant for production use The require hook is primarily recommended for simple cases.
-
sandiprb over 7 yearsin this case, how am I going to run my app in production? Do I need to compile my files down to es5? :/
-
ahmed hamdy over 7 years@sandip_rb yes you must compile your files before going to production. you must figure out this solution works for
node.js
versions doesn't supportES6
(less than 4.x versions), Nownode.js
version supportES6
-
ahmed hamdy over 7 years@sandip_rb see useful link about use babel into production -> medium.com/@Cuadraman/…
-
Felipe Martim over 7 yearsFrom the docs: You should not be using babel-node in production. It is unnecessarily heavy, with high memory usage due to the cache being stored in memory. You will also always experience a startup performance penalty as the entire app needs to be compiled on the fly.
-
Frank Nocke over 6 yearsUpdate: es of 2017, the preferable common preset is preset-env. And as long, as that is installed, it doesn't even need to be specified...
-
Frank Nocke over 6 years...thus, as long as
babel-cli
andpreset-env
is installed, and if you like things directly (w/o npm run... and the package.json-editing required) the command (issued from project root) is:$> ./node_modules/.bin/babel-node yourToolhere.js
-
stackdave over 6 yearsthe problem this transpilation just convert the js files and does not include the node modules inside
-
Maciej Sikora over 6 yearscreate second build command like - "build-modules": "babel node-modules/ -d dist/",
-
Nditah almost 6 yearsnode -r babel-register scripts.js works like charm and quite simple in dev
-
Dmitry Davydov over 5 yearsYou can see that rest parameters are supported now kangax.github.io/compat-table/es6/#node8_10
-
Philip Rego over 3 yearsWhy would i need all those dependencies just to run a certain js version
-
Besworks about 2 yearsThe Active LTS version of Node (v16 at this time) and beyond have most ES6 features enabled by default. Setting
type
tomodule
inpackage.json
only enables theimport
/export
syntax. This has the side effect of disablingrequire()
and not setting certain globals like__dirname
which may not always be desirable.