First we'll install @babel/cli, @babel/core and @babel/preset-env.
$ npm install --save-dev @babel/cli @babel/core @babel/preset-envThen we'll create a .babelrc file for configuring babel.
$ touch .babelrcThis will host any options we might want to configure babel with.
{
"presets": ["@babel/preset-env"]
}Then create our server in index.js.
$ touch index.jsimporthttpfrom'http';constserver=http.createServer((req,res)=>{res.writeHead(200,{'Content-Type': 'text/plain'});res.end('Hello World\n');}).listen(1337,'127.0.0.1');console.log('Server running at http://127.0.0.1:1337/');exportdefaultserver;With recent changes to babel, you will need to transpile your ES6 before node can run it.
So, we'll add our first script, build, in package.json.
"scripts": {
+ "build": "babel index.js -d dist"
}Then we'll add our start script in package.json.
"scripts": {
"build": "babel index.js -d dist",
+ "start": "npm run build && node dist/index.js"
}Now let's start our server.
$ npm startYou should now be able to visit http://127.0.0.1:1337 and see Hello World.
We can improve our npm start script with nodemon.
$ npm install --save-dev nodemonThen we can update our npm start script.
"scripts": {
"build": "babel index.js -d dist",
- "start": "npm run build && node dist/index.js"+ "start": "npm run build && nodemon dist/index.js"
}Then we'll restart our server.
$ npm startYou should now be able to make changes to index.js and our server should be
restarted automatically by nodemon.
Go ahead and replace Hello World with Hello {{YOUR_NAME_HERE}} while our
server is running.
If you visit http://127.0.0.1:1337 you should see our server greeting you.
First let's move our server index.js file to lib/index.js.
$ mkdir lib
$ mv index.js lib/index.jsAnd update our npm start script to reflect the location change.
"scripts": {
- "build": "babel index.js -d dist",+ "build": "babel lib -d dist",
"start": "npm run build && nodemon dist/index.js"
}Next let's add a new task: npm run serve.
"scripts": {
"build": "babel lib -d dist",
"start": "npm run build && nodemon dist/index.js",
+ "serve": "node dist/index.js"
}Now we can use npm run build for precompiling our assets, and npm run serve
for starting our server in production.
$ npm run build
$ npm run serveThis means we can quickly restart our server without waiting for babel to
recompile our files.
Oh, let's not forget to add dist to our .gitignore file:
$ touch .gitignoredist
This will make sure we don't accidentally commit our built files to git.
Finally let's make sure our server is well tested.
Let's install mocha.
$ npm install --save-dev mochaAnd create our test in test/index.js.
$ mkdir test
$ touch test/index.jsimporthttpfrom'http';importassertfrom'assert';importserverfrom'../lib/index.js';describe('Example Node Server',()=>{it('should return 200',done=>{http.get('http://127.0.0.1:1337',res=>{assert.equal(200,res.statusCode);server.close();done();});});});Next, install @babel/register for the require hook.
$ npm install --save-dev @babel/registerThen we can add an npm test script.
"scripts": {
"start": "nodemon lib/index.js --exec babel-node",
"build": "babel lib -d dist",
"serve": "node dist/index.js",
+ "test": "mocha --require @babel/register"
}Now let's run our tests.
$ npm testYou should see the following:
Server running at http://127.0.0.1:1337/
Example Node Server
✓ should return 200
1 passing (43ms)That's it!