了解节点流和 vinyl-fs

Understanding node streams and vinyl-fs

我遇到了一个奇怪的问题,我不确定我的问题出在哪里。可能是因为我对节点流或vinyl-fs的一些基础知识缺乏了解。

无论如何,这里是描述:

我正在构建我想与 gulp 一起使用的不同脚本。

例如,这个正在构建我需要的一些资产;更准确地说,我正在将 bootstrap 个源文件从 node_modules 复制到我的资产文件夹。

这个函数应该 return 一个 promise,这样我可以更容易地与 gulp 一起使用它。

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

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 任务:

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()。我认为我的第一个例子根本不需要...

任何提示或解释将不胜感激。

谢谢!

所以,这是一个反模式。

我们不应该混合承诺和流;正确的做法是 return sass_bootstrap 上的流并收听 end/error 事件:

sass-bootstrap.js

var vinylFs  = require( 'vinyl-fs' );

function sass_bootstrap() {
  return vinylFs
    .src( [ bootstrap_sass_route + '/**/_*.scss' ] )
    .pipe( vinylFs.dest( assets_sass_bootstrap ) )
}

gulp任务

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