默认情况下,在 stream 中发生一个错误的话,它会被直接抛出,除非已经有一个时间监听器监听着 error
时间。 这在处理一个比较长的管道操作的时候会显得比较棘手。
通过使用 stream-combiner2,你可以将一系列的 stream 合并成一个,这意味着,你只需要在你的代码中一个地方添加监听器监听 error
时间就可以了。
安装
npm install --save-dev stream-combiner2
流合并方式监控错误: http://www.gulpjs.com.cn/docs/recipes/combining-streams-to-handle-errors/
这里是参考上面gulp官网中的例子进行测试。
-
1234567891011var gulp = require ( 'gulp' ) ;var uglify = require ( 'gulp-uglify' ) ;gulp . task ( 'test' , function ( ) {//正常走binary管道的方式 (故意写错js,出错也抛异常,但是找不到错误在哪)gulp . src ( 'src/*.js' ). pipe ( uglify ( )). pipe ( gulp . dest ( 'dest' )) ;}) ;
我这里故意将src目录下的test,js测试文件写错:
-
1234function a ( ) {return 11 ture ;}a ( ) ;
然后git bash运行 gulp test,运行结果如下图:
是不是瞬间不想活了,反正我看起来是一脸的懵逼。。。
然而这一切在有了stream-combiner2之后,就完全不一样了。
这是使用stream-combiner2的代码,绑定了默认任务,省的麻烦每次都还要写gulp test :
-
1234567891011121314151617181920var gulp = require ( 'gulp' ) ;var combiner = require ( 'stream-combiner2' ) ;var uglify = require ( 'gulp-uglify' ) ;gulp . task ( 'test' , function ( ) {//流合并监听的方式 (故意写错了js,能够监听到错误处在哪个文件,和错误的具体位置)var combined = combiner . obj ([gulp . src ( 'src/*.js' ) ,uglify ( ) ,gulp . dest ( 'dest' )]) ;//监听错误combined . on ( 'error' , console . error . bind ( console )) ;return combined ;}) ;gulp . task ( 'default' , [ 'test' ]) ;
执行gulp输出结果如下图:
它会把错误的信息、文件名、行数、列数·、位置、是执行哪个插件出现的错误,错误文件的路径,错误时间等等详细的信息都列出来。
不仅如此,大家有没有发现一个小细节,就是使用了stream-combiner2的方式,在执行uglify的时候没有通过管道。
这里我也很奇怪,gulp不是通过binary pipe方式执行的么,这里为什么不需要通过管道了呢?
看了github上的文档才知道,它会把pipe管道转换成stream流的形式。
这样的话,每次都使用stream-combiner2的方式,用combiner.obj([执行内容]);的方式,就不用每一个步骤都建立管道再走管道了,
转自:http://www.qdfuns.com/notes/33133/0737f1319260aedfcc62efba84d2c4bf.html