2014-12-27 87 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