webappengine
Version:
A web application platform that can host multiple web apps running with Node.js.
89 lines (78 loc) • 3.61 kB
JavaScript
var _ = require('lodash');
var gulp = require('gulp');
var gutil = require('gulp-util');
var path = require('path');
var browserify = require('browserify');
var source = require('vinyl-source-stream');
var streamify = require('gulp-streamify');
var uglify = require('gulp-uglify');
var notify = require('gulp-notify');
var gulpif = require('gulp-if');
var rename = require('gulp-rename');
var exorcist = require('exorcist');
var watchify = require('watchify');
module.exports = function(options) {
gulp.task('browserify', ['browserify:vendor-bundler', 'browserify:app-bundler']);
gulp.task('browserify:vendor-bundler', function() {
var browserifyConfig = _.get(options.config, 'browserify.vendor') || {};
var uglifyConfig = _.get(options.config, 'uglify') || {};
var bundleFile = 'vendor.js';
var bundleMapFile = path.join(browserifyConfig.dest, 'vendor.js.map');
var minifiedBundleFile = 'vendor.min.js';
// Create a separate vendor bundler that will only run when starting gulp
var bundler = browserify(browserifyConfig.options);
_.each(browserifyConfig.require, function(lib) {
bundler.require(lib);
});
var start = new Date();
return bundler.bundle()
.on('error', options.errorHandler.error)
.pipe(exorcist(bundleMapFile))
.pipe(source(bundleFile))
.pipe(gulpif(options.env !== 'development', streamify(uglify(uglifyConfig.options))))
.pipe(gulp.dest(browserifyConfig.dest))
.pipe(notify(function() {
console.log('The ' + JSON.stringify(bundleFile) + ' bundle built in ' + (Date.now() - start) + 'ms');
}));
});
gulp.task('browserify:app-bundler', function() {
var browserifyConfig = _.get(options.config, 'browserify.app') || {};
var uglifyConfig = _.get(options.config, 'uglify') || {};
var browserifyTransform = browserifyConfig.transform;
var bundleFile = 'app.js';
var bundleMapFile = path.join(browserifyConfig.dest, 'app.js.map');
var minifiedBundleFile = 'app.min.js';
// Create the application bundler
var bundler = browserify(browserifyConfig.options);
bundler.add(browserifyConfig.src);
bundler.transform('babelify');
bundler.transform('reactify'); // Use reactify to transform JSX content
bundler.transform('browserify-css', browserifyTransform['browserify-css']);
bundler.transform('brfs');
bundler.transform('browserify-shim', browserifyTransform['browserify-shim']);
_.each(browserifyConfig.external, function(lib) {
bundler.external(lib);
});
// The actual bundling process
var rebundle = function() {
var start = Date.now();
bundler.bundle()
.on('error', options.errorHandler.error)
.pipe(exorcist(bundleMapFile))
.pipe(source(bundleFile))
.pipe(gulpif(options.env !== 'development', streamify(uglify(uglifyConfig.options))))
.pipe(gulp.dest(browserifyConfig.dest))
.pipe(notify(function() {
console.log('The ' + JSON.stringify(bundleFile) + ' bundle built in ' + (Date.now() - start) + 'ms');
}));
};
// Add watchify
if (options.watch) {
bundler = watchify(bundler);
bundler.on('update', rebundle);
}
// Trigger the initial bundling
rebundle();
return bundler;
});
};