最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - gulp browserify reactify task is quite slow - Stack Overflow

programmeradmin2浏览0评论

I am using Gulp as my task runner and browserify to bundle my CommonJs modules.

I have noticed that running my browserify task is quite slow, it takes around 2 - 3 seconds, and all I have is React and a few very small components I have built for development.

Is there a way to speed up the task, or do I have any noticeable problems in my task?

gulp.task('browserify', function() {
  var bundler = browserify({
    entries: ['./main.js'], // Only need initial file
    transform: [reactify], // Convert JSX to javascript
    debug: true, cache: {}, packageCache: {}, fullPaths: true
  });

  var watcher  = watchify(bundler);

  return watcher
  .on('update', function () { // On update When any files updates
    var updateStart = Date.now();
        watcher.bundle()
        .pipe(source('bundle.js'))
        .pipe(gulp.dest('./'));
        console.log('Updated ', (Date.now() - updateStart) + 'ms');
  })
  .bundle() // Create initial bundle when starting the task 
  .pipe(source('bundle.js'))
  .pipe(gulp.dest('./'));
});

I am using Browserify, Watchify, Reactify and Vinyl Source Stream as well as a few other unrelated modules.

var browserify = require('browserify'),
watchify = require('watchify'),
reactify = require('reactify'),
source = require('vinyl-source-stream');

Thanks

I am using Gulp as my task runner and browserify to bundle my CommonJs modules.

I have noticed that running my browserify task is quite slow, it takes around 2 - 3 seconds, and all I have is React and a few very small components I have built for development.

Is there a way to speed up the task, or do I have any noticeable problems in my task?

gulp.task('browserify', function() {
  var bundler = browserify({
    entries: ['./main.js'], // Only need initial file
    transform: [reactify], // Convert JSX to javascript
    debug: true, cache: {}, packageCache: {}, fullPaths: true
  });

  var watcher  = watchify(bundler);

  return watcher
  .on('update', function () { // On update When any files updates
    var updateStart = Date.now();
        watcher.bundle()
        .pipe(source('bundle.js'))
        .pipe(gulp.dest('./'));
        console.log('Updated ', (Date.now() - updateStart) + 'ms');
  })
  .bundle() // Create initial bundle when starting the task 
  .pipe(source('bundle.js'))
  .pipe(gulp.dest('./'));
});

I am using Browserify, Watchify, Reactify and Vinyl Source Stream as well as a few other unrelated modules.

var browserify = require('browserify'),
watchify = require('watchify'),
reactify = require('reactify'),
source = require('vinyl-source-stream');

Thanks

Share Improve this question edited Jan 30, 2015 at 23:08 Brigand 86.2k20 gold badges167 silver badges173 bronze badges asked Jan 27, 2015 at 3:20 svnmsvnm 24.3k23 gold badges94 silver badges109 bronze badges
Add a comment  | 

3 Answers 3

Reset to default 17

See fast browserify builds with watchify. Note that the only thing passed to browserify is the main entry point, and watchify's config.

The transforms are added to the watchify wrapper.

code from article pasted verbatim

var gulp = require('gulp');
var gutil = require('gulp-util');
var sourcemaps = require('gulp-sourcemaps');
var source = require('vinyl-source-stream');
var buffer = require('vinyl-buffer');
var watchify = require('watchify');
var browserify = require('browserify');

var bundler = watchify(browserify('./src/index.js', watchify.args));
// add any other browserify options or transforms here
bundler.transform('brfs');

gulp.task('js', bundle); // so you can run `gulp js` to build the file
bundler.on('update', bundle); // on any dep update, runs the bundler

function bundle() {
  return bundler.bundle()
    // log errors if they happen
    .on('error', gutil.log.bind(gutil, 'Browserify Error'))
    .pipe(source('bundle.js'))
    // optional, remove if you dont want sourcemaps
      .pipe(buffer())
      .pipe(sourcemaps.init({loadMaps: true})) // loads map from browserify file
      .pipe(sourcemaps.write('./')) // writes .map file
    //
    .pipe(gulp.dest('./dist'));
}

You have to use watchify and enable its cache. Take a look at : https://www.codementor.io/reactjs/tutorial/react-js-browserify-workflow-part-2 and for more optimisation when building source-map you could do that :

cd node_modules/browserify && npm i substack/browser-pack#sm-fast this would safe you half of time

part of my gulpfile.js

var gulp = require('gulp');
var uglify = require('gulp-uglify');
var htmlreplace = require('gulp-html-replace');
var source = require('vinyl-source-stream');
var browserify = require('browserify');
var watchify = require('watchify');
var reactify = require('reactify');
var streamify = require('gulp-streamify');

var path = {
    OUT : 'build.js',
    DEST2 : '/home/apache/www-modules/admimail/se/se',
    DEST_BUILD : 'build',
    DEST_DEV : 'dev',
    ENTRY_POINT : './src/js/main.jsx'
};

gulp.task('watch', [], function() {
    var bundler = browserify({
        entries : [ path.ENTRY_POINT ],
        extensions : [ ".js", ".jsx" ],
        transform : [ 'reactify' ],
        debug : true,
        fullPaths : true,
        cache : {}, // <---- here is important things for optimization 
        packageCache : {} // <----  and here
    });
    bundler.plugin(watchify, {
//      delay: 100,
//      ignoreWatch: ['**/node_modules/**'],
//      poll: false
    });

    var rebundle = function() {
        var startDate = new Date();
        console.log('Update start at ' + startDate.toLocaleString());
        return bundler.bundle(function(err, buf){
                if (err){
                    console.log(err.toString());
                } else {
                    console.log(' updated in '+(new Date().getTime() - startDate.getTime())+' ms');
                }
            })
            .pipe(source(path.OUT))
            .pipe(gulp.dest(path.DEST2 + '/' + path.DEST_DEV))
            ;
    };

    bundler.on('update', rebundle);
    return rebundle();
});

gulp.task('default', [ 'watch' ]);

Many thanks to @PHaroZ for that answer. I had to modify a little bit that code for my needs though. I am working with ReactJS on Symfony2 framework and all my builds were taking 7s-21s!!! Crazy.. So that's what I have now:

var path = {
    OUT : 'app.js',
    DEST_BUILD : './src/MyBundle/Resources/js/dist',
    ENTRY_POINT : './src/MyBundle/Resources/js/src/app.js'
};

gulp.task('watch', [], function() {
    var bundler = browserify({
        entries : [ path.ENTRY_POINT ],
        extensions : [ ".js", ".jsx" ],
//        transform : [ 'reactify' ],
        debug : true,
        fullPaths : true,
        cache : {}, // <---- here is important things for optimization
        packageCache : {} // <----  and here
    }).transform("babelify", {presets: ["es2015", "react"]});
    bundler.plugin(watchify, {
//      delay: 100,
//      ignoreWatch: ['**/node_modules/**'],
//      poll: false
    });

    var rebundle = function() {
        var startDate = new Date();
        console.log('Update start at ' + startDate.toLocaleString());
        return bundler.bundle(function(err, buf){
                if (err){
                    console.log(err.toString());
                } else {
                    console.log(' updated in '+(new Date().getTime() - startDate.getTime())+' ms');
                }
            })
            .pipe(source(path.OUT))
            .pipe(gulp.dest(path.DEST_BUILD))
            ;
    };

    bundler.on('update', rebundle);
    return rebundle();
});

Now first compile takes around 20s and each time I update my file it takes around 800ms. It's just enough time to switch from IDE to my browser.

发布评论

评论列表(0)

  1. 暂无评论