了解节点流和 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 )
});
});
我遇到了一个奇怪的问题,我不确定我的问题出在哪里。可能是因为我对节点流或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 )
});
});