2014-12-27 51 views
7

我想实现这个咕嘟咕嘟流:Browserify只有皮棉通过在咕嘟咕嘟

enter image description here

这似乎是一个相当简单的过程,但是从我所知道的,这是不可能的作为一个Gulp流实施。

目前,我正在做这个:

gulp.task('js', function() { 
    return browserify('foo/main.js') 
     .bundle() 
     .pipe(source('bundle.js')) 
     .pipe(streamify(jshint())) 
     .pipe(jshint.reporter('default')) 
     // source map, minify, … 
}); 

的问题是,JSHint应该仅在更改后的文件第一次运行,如果皮棉失败的过程中,应中止。在我的设置中,Browserify总是运行,然后只有JSHint在整个bundle上运行。我可以处理性能损失,但JSHint的行号对应于生成的包,而不是我的JS源文件,这很痛苦。

回答

7

这是一个很酷的想法。我已经使用watchify在我的管道中实现了这一点,它将使用默认记录器对文件进行lint处理,如果文件更改未通过lint测试,则使用失败记者。尽管在这个问题上建议这样做,但我个人会避免这样做,因为您真正想要的只是让您的记者发出皮棉检查,同时让开发观察者仍然在后台产生。否则,你必须继续重新开始任务,这通常会导致我的错误。总之,这里的代码:

'use strict'; 

var assign  = require('object-assign'), 
    gulp   = require('gulp'), 
    gutil  = require('gulp-util'), 
    merge  = require('merge-stream'), 
    jshint  = require('gulp-jshint'), 
    source  = require('vinyl-source-stream'), 
    watchify  = require('watchify'), 
    browserify = require('browserify'); 

var resources = { 
    mainJS : 'main.js', 
    bundleJS : 'bundle.js', 
    root  : 'www' 
}; 

function res(r) { 
    return './' + resources[r]; 
} 

gulp.task('watch', function() { 
    var bundler = watchify(browserify(res('mainJS'), assign(watchify.args, { 
     fullPaths: false 
    }))); 

    var scripts = function(changedFiles) { 
     var compileStream = bundler 
      .bundle() 
      .on('error', gutil.log.bind(gutil, gutil.colors.red('Browserify Error\n'))) 
      .pipe(source(res('bundleJS'))) 
      .pipe(gulp.dest(res('root'))); 

     if (changedFiles) { 
      var lintStream = gulp.src(changedFiles) 
       .pipe(jshint()) 
       .pipe(jshint.reporter('default')) 
       .pipe(jshint.reporter('fail')); 

      return merge(lintStream, compileStream); 
     } 

     return compileStream; 
    }; 

    bundler.on('update', scripts); 

    return scripts(); 
}); 

注意,这在很大程度上基于从官方几招快速browserify建立与watchify(https://github.com/gulpjs/gulp/blob/master/docs/recipes/fast-browserify-builds-with-watchify.md),并且是一个“所有功能于一身的”类型的任务;也就是说,我一般会产生一个单一的任务关在后台的某个地方,有最小记录(我运行与--silent标志一整套),这是个人更容易处理:-)

+0

非常酷的应用[合并流(https://www.npmjs.com/package/merge-stream) – plong0 2017-04-07 19:45:46