Overview
If we want to set up a fast way to develop React web apps, we have to be able to compile jsx files quickly. To accomplish this, we use browserify and grunt. Read the following posts before going further: Setup Grunt, Continuous NodeJS.
Step 1: Installation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# ### in Terminal ###
npm install --save react
npm install --save-dev grunt
npm install --save-dev load-grunt-tasks
npm install --save-dev grunt-contrib-watch
npm install --save-dev grunt-contrib-clean
npm install --save-dev grunt-nodemon
npm install --save-dev grunt-concurrent
npm install --save-dev grunt-browserify
npm install --save-dev grunt-react
touch Gruntfile.js
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
// ### in Gruntfile.js ###
module.exports = function(grunt){
    require('load-grunt-tasks')(grunt);
    grunt.initConfig({
        watch: {
            livereload: {
                tasks: ['clean', 'browserify'],
                options: {
                    livereload: true
                },
                files: [
                    './public/**/*.less',
                    './public/**/*.jsx',
                    './public/**/*.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
        clean: {
            build: {
                src: ['./public/javascripts/build.min.js']
            }
        }, // End clean
        browserify: {
            options: {
                transform: [ require('grunt-react').browserify ]
            },
            files: {
                src: ['./public/javascripts/**/*.jsx', './public/javascripts/**/*.js'],
                dest: './public/javascripts/build.min.js'
            }
        } // End browserify
    });
    grunt.registerTask('default', ['clean', 'browserify', 'concurrent:dev']);
};
watch: Will watch changes and run clean, browserify and reload.
nodemon: Will restart the server when files change.
concurrent: Will run both watch and nodemon at the same time.
clean: Will remove the old build.min.js
browserify: Will concatinate all the js files and jsx files into 1.
Step 3: Dev
With this setup, we can add jsx and js files. Your directory (at the beginning… it shouldn’t look this way) will look like this.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
.
├── Gruntfile.js
├── app.js
├── bin
│   └── www
├── package.json
├── public
│   ├── images
│   ├── javascripts
│   │   ├── build.min.js
│   │   ├── driver.jsx
│   │   └── test.jsx
│   └── stylesheets
│       ├── style.css
│       └── style.less
├── routes
│   ├── index.js
│   └── users.js
└── views
    ├── error.ejs
    └── index.ejs
1
2
3
4
5
6
7
8
9
10
11
12
13
// ### in test.jsx ###
/** @jsx React.DOM */
var React = require('react');
var Test = React.createClass({
    render: function(){
        return (
            <h1>Hello From React</h1>
        );
    }
});
module.exports = Test;
1
2
3
4
5
6
7
8
9
10
// ### in driver.jsx ###
/** @jsx React.DOM */
var React = require('react');
var Test = require('./test.jsx');
window.onload = function(){
    React.render(<Test />, document.body);
};
You have to make sure to require build.min.js in index.ejs.
Now you can simply call grunt and the server will start up. Any change you make to a jsx, js, less or ejs file will reload the server and the browser tab.