了解节点stream和vinyl-fs

我有一个奇怪的问题,我不知道我的问题在哪里。 可能是因为我缺乏对节点stream或乙烯fs基础知识的理解。

无论如何,这里是描述:

我正在构build不同的脚本,我想用吞咽。

比如,这个正在build设一些我需要的资产。 更确切地说,我正在将引导源文件从node_modules复制到我的资产文件夹。

这个函数应该返回一个promise,这样我就可以更容易地用它来使用它。

这是sass-bootstrap.js文件,它将完成这项工作:

  • 这是一个较短的版本,之前有一些检查,但与我的问题没有关系。
  • 假定所有的variables定义。
var defer = Q.defer(), vinylFs = require( 'vinyl-fs' ), map = require( 'map-stream' ); function sass_bootstrap() { var defer = Q.defer(); vinylFs.src( [ bootstrap_sass_route + '/**/_*.scss' ] ) .pipe( vinylFs.dest( assets_sass_bootstrap ) ) .pipe( map( function( file, cb ) { cb( null, file ); })) .on( 'end', function(){ defer.resolve(); }); return defer.promise; } 

这是使用它的一口气任务:

  • 再次是它的简化版本,只有相关的代码包括在内
 gulp.task( 'development', function ( cb ) { sass_bootstrap() .then( function(){ cb(); }) .catch( function( err ){ err.log(); cb(); }); }); 

这是行之有效的,但我不明白为什么它不这样工作:

 function sass_bootstrap() { var defer = Q.defer(); vinylFs.src( [ bootstrap_sass_route + '/**/_*.scss' ] ) .pipe( vinylFs.dest( assets_sass_bootstrap ) ) .on( 'end', function(){ defer.resolve(); }); return defer.promise; } 

此外,我不明白为什么我需要调用map() 。 我想我的第一个例子根本不需要…

任何暗示或解释将非常感激。

谢谢!

所以,这是一个反模式。

我们不应该混合承诺和stream。 这样做的正确方法是返回sass_bootstrap上的stream并侦听结束/错误事件:

上海社会科学院,bootstrap.js

 var vinylFs = require( 'vinyl-fs' ); function sass_bootstrap() { return vinylFs .src( [ bootstrap_sass_route + '/**/_*.scss' ] ) .pipe( vinylFs.dest( assets_sass_bootstrap ) ) } 

吞噬任务

 gulp.task( 'development', function ( cb ) { return sass_bootstrap() .on( 'end', cb ); .on( 'error' function( err ) { // Do error stuff cb( err ) }); });