Gulpfile for projects with LESS, Browserify and React
This gulpfile.js provides the following:
- A
jstarget that builds a JavaScript bundle usingbrowserify - A
csstarget that builds a single CSS file usingless - Support for a
--productionflag, which will minify sources - A
watchtarget that runswatchifyfor the JavaScript sources and standardgulp.watch()for the LESS sources for robust real-time reloading of both.
Configure it by changing the variables near the top, under the imports.
You need to install a bunch of packages:
$ npm install --save-dev browserify reactify watchify vinyl-source-stream gulp gulp-sourcemaps gulp-util vinyl-buffer gulp-less yargs gulp-if gulp-minify-css gulp-uglify
Then create gulpfile.js as per below:
/*jshint globalstrict:true, devel:true, newcap:false */
/*global require */
/**
* Build CSS and JavaScript using `gulp`.
*
* Main targets are: `js`, `css` and `watch`.
*
* Run with `--production` to get minified sources.
*/
"use strict";
var argv = require('yargs').argv,
gulp = require('gulp'),
gutil = require('gulp-util'),
gulpif = require('gulp-if'),
source = require('vinyl-source-stream'),
buffer = require('vinyl-buffer'),
sourcemaps = require('gulp-sourcemaps'),
browserify = require('browserify'),
watchify = require('watchify'),
reactify = require('reactify'),
uglify = require('gulp-uglify'),
less = require('gulp-less'),
minifyCSS = require('gulp-minify-css');
// Directory where static files are found. Don't forget the slash at the end.
var staticDirectory = './static/',
// Source and target JS files for Browserify
jsMainFile = staticDirectory + 'js/app.jsx',
jsBundleFile = 'bundle.js',
// Source and target LESS files
cssMainFile = staticDirectory + 'less/styles.less',
cssFiles = staticDirectory + 'less/**/*.less';
// Browserify bundler, configured for reactify with sources having a .jsx extension
var bundler = browserify({
entries: [jsMainFile],
transform: [reactify],
extensions: ['.jsx'],
debug: !argv.production,
cache: {}, packageCache: {}, fullPaths: true // for watchify
});
// Build JavaScript using Browserify
gulp.task('js', function() {
return bundler
.bundle()
.pipe(source(jsBundleFile))
.pipe(buffer())
.pipe(gulpif(!argv.production, sourcemaps.init({loadMaps: true}))) // loads map from browserify file
.pipe(gulpif(!argv.production, sourcemaps.write('./'))) // writes .map file
.pipe(gulpif(argv.production, uglify()))
.pipe(gulp.dest(staticDirectory));
});
// Build CSS
gulp.task('css', function(){
return gulp.src(cssMainFile)
.pipe(less())
.pipe(gulpif(argv.production, minifyCSS({keepBreaks:true})))
.pipe(gulp.dest(staticDirectory));
});
// Watch JS + CSS using watchify + gulp.watch
gulp.task('watchify', function() {
var watcher = watchify(bundler);
return watcher
.on('error', gutil.log.bind(gutil, 'Browserify Error'))
.on('update', function () {
watcher.bundle()
.pipe(source(jsBundleFile))
.pipe(buffer())
.pipe(sourcemaps.init({loadMaps: true})) // loads map from browserify file
.pipe(sourcemaps.write('./')) // writes .map file
.pipe(gulp.dest(staticDirectory));
gutil.log("Updated JavaScript sources");
})
.bundle() // Create the initial bundle when starting the task
.pipe(source(jsBundleFile))
.pipe(gulp.dest(staticDirectory));
});
gulp.task('csswatch', function () {
gulp.watch(cssFiles, ['css']);
});
gulp.task('watch', ['watchify', 'csswatch']);
gulp.task('default', ['js', 'css']);Written by Martin Aspeli
Related protips
Have a fresh tip? Share with Coderwall community!
Post
Post a tip
Best
#Frontend
Authors
Did you know?
JavaScript on a page runs with the privileges of that origin. One altered library, tag manager, or snippet can read inputs, change what people see, and call your APIs as the user.
Security insights from Cside
Sponsored by #native_company# — Learn More
#native_title#
#native_desc#