Overview
This post is all about continuous development using NodeJS and Express 4. I’m going to be basing this post off of this blog post.
Step 1: Installation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# global
npm install -g express
npm install -g express-generator
npm install -g grunt-cli
# create express app with EJS for template, Less for css and a .gitignore file
express -e -c less --git
touch Gruntfile.js
# dev
npm install --save-dev grunt
npm install --save-dev load-grunt-tasks
npm install --save-dev grunt-contrib-watch
npm install --save-dev grunt-nodemon
npm install --save-dev grunt-concurrent
Explanation
load-grunt-tasks
: will be used to load all the grunt tasks right away.
grunt-contrib-watch
: will allow us to watch for file changes and execute grunt tasks.
grunt-nodemon
: we will use it to reload the server when a file changes.
grunt-concurrent
: watch has livereload built in, so we want to be able to reload the page and restart server automatically.
Structure
The directory should look like this:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
.
├── Gruntfile.js
├── app.js
├── bin
│ └── www
├── package.json
├── public
│ ├── images
│ ├── javascripts
│ └── stylesheets
│ └── style.less
├── routes
│ ├── index.js
│ └── users.js
└── views
├── error.ejs
└── index.ejs
Step 2: Setup
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
// ### in Gruntfile.js ###
'use strict';
module.exports = function(grunt){
require('load-grunt-tasks')(grunt);
grunt.initConfig({
watch: {
livereload: {
options: {
livereload: true
},
files: [
'public/**/*.{less,js}',
'views/**/*.ejs'
]
}
}, // End watch
nodemon: {
dev: {
options: {
nodeArgs: ['--debug'],
file: '--debug ./bin/www'
}
}
}, //End nodemon
concurrent: {
dev: {
options: {
logConcurrentOutput: true
},
tasks: ['watch', 'nodemon:dev']
}
}, // End concurrent
});
grunt.registerTask('default', ['concurrent:dev']);
};
Step 3: Dev
Now you can simply call grunt
and the server will start up. When you make a change to a file and save, it will refresh the page.