Skip to content

Instantly share code, notes, and snippets.

@AVVS
Created December 10, 2015 12:37
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save AVVS/90eb98b0189926a16ba3 to your computer and use it in GitHub Desktop.
Save AVVS/90eb98b0189926a16ba3 to your computer and use it in GitHub Desktop.
efficient browserify build with external bundles
const gulp = require('gulp');
const gutil = require('gulp-util');
const source = require('vinyl-source-stream');
const buffer = require('gulp-buffer');
const babelify = require('babelify');
const Browserify = require('browserify');
const nodemon = require('gulp-nodemon');
const path = require('path');
const rev = require('gulp-rev');
const revDel = require('rev-del');
const derequire = require('gulp-derequire');
const gulpif = require('gulp-if');
const collapser = require('bundle-collapser/plugin');
const shim = require('browserify-shim');
const bundler = new Browserify({
debug: true,
fullPaths: true,
})
.transform(shim, { global: true })
.transform(babelify.configure({
sourceMapRelative: 'public/js',
optional: ['es7.objectRestSpread', 'es7.classProperties', 'es7.decorators'],
}))
.require('./src/frontend/browser.jsx', { entry: true });
// optional minification
if (process.env.NODE_ENV === 'production') {
bundler.plugin('minifyify', { map: '/public/js/browser.js.map', output: 'assets/browser.js.map' });
bundler.plugin(collapser);
}
function error(err) {
gutil.log(err.stack || err);
this.emit('end');
}
function bundle() {
gutil.log('Compiling JS...');
return bundler.bundle()
.on('error', error)
.pipe(source('browser.js'))
.pipe(gulpif(process.env.NODE_ENV === 'production', derequire()))
.pipe(buffer())
.pipe(rev())
.pipe(gulp.dest('./assets'))
.pipe(rev.manifest())
.pipe(revDel({ dest: './assets' }))
.pipe(gulp.dest('./assets'));
}
/**
* Gulp task alias
*/
gulp.task('bundle', function bundleTask() {
return bundle();
});
/**
* Gulp task alias
*/
gulp.task('default', ['bundle']);
// nodemon --watch ./src -e js,jsx,html ./bin/server.js | ./node_modules/.bin/bunyan -o short
gulp.task('watch', ['bundle'], function watcher() {
nodemon({
script: './bin/server.js',
ext: 'js html jsx css',
watch: './src',
env: {
'NODE_ENV': 'development',
},
tasks: function onFileChange(changedFiles) {
const tasks = [];
changedFiles.forEach(file => {
if (path.extname(file) === '.jsx' && !~tasks.indexOf('bundle')) {
tasks.push('bundle');
}
});
return tasks;
},
});
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment