Search code examples
javascriptgulpglobbrowserify

Chain Gulp glob to browserify transform


I have a project with a few relatively disjoint pages, each including their own entry point script. These scripts require a number of others using commonjs syntax, and need to be transformed by 6to5 and bundled by browserify.

I would like to set up a gulp task that captures all the files matching a pattern and passes them on to the bundler, but I'm not sure how to pass files from gulp.src to browserify(filename).

My gulpfile looks like:

var gulp = require("gulp");
var browserify = require("browserify");
var to5browserify = require("6to5-browserify");
var source = require("vinyl-source-stream");

var BUNDLES = [
    "build.js",
    "export.js",
    "main.js"
];

gulp.task("bundle", function () {
    /* Old version, using glob:
    return gulp.src("src/** /*.js")
        .pipe(sixto5())
        .pipe(gulp.dest("dist"));
    */

    // New version, using array:
    return BUNDLES.map(function (bundle) {
        return browserify("./src/" + bundle, {debug: true})
            .transform(to5browserify)
            .bundle()
            .pipe(source(bundle))
            .pipe(gulp.dest("./dist"));
    });
});

gulp.task("scripts", ["bundle"]);

gulp.task("html", function () {
    return gulp.src("src/**/*.html")
        .pipe(gulp.dest("dist"));
});

gulp.task("styles", function () {
    return gulp.src("src/**/*.css")
        .pipe(gulp.dest("dist"));
});

gulp.task("default", ["scripts", "html", "styles"]);

This seems to work, but isn't maintainable: I'll be adding more scripts relatively soon, and don't want to add them to the array every time.

I've tried using gulp.src(glob).pipe within the browserify call and piping after calling (shown here), and gulp.src(glob).map (method doesn't exist).

How can you chain gulp.src with a name-based transformer like browserify?


Solution

  • Use through2 to make a one-off custom plugin stream that does all of the dirty work.

    Unfortanately vinyl-transform and vinyl-source-stream and the solutions that go along with those have flaws so we have to go for something custom.

    var gulp = require('gulp');
    var through = require('through2');
    var browserify = require('browserify');
    
    gulp.task('bundle', function() {
        var browserified = function() {
            return through.obj(function(chunk, enc, callback) {
                if(chunk.isBuffer()) {
                    var b = browserify(chunk.path);
                        // Any custom browserify stuff should go here
                        //.transform(to5browserify);
    
                    chunk.contents = b.bundle();
    
                    this.push(chunk);
    
                }
                callback();
            });
        };
    
        return gulp.src(['./src/**/*.js'])
            .pipe(browserified())
            .pipe(gulp.dest('dest'));
    });