我有一个工作流程,如下所示:
gulp.src('**/*.js')
.pipe(doSomething())
.pipe(dest('out'));
我希望doSomething
返回一个流管道,比如uglify().pipe(header(...)).pipe(rename(...))
,以便有效的结果是
gulp.src('**/*.js')
.pipe(uglify())
.pipe(header(...))
.pipe(rename(...))
.pipe(dest('out'));
显然doSomething
无法返回uglify(因为dest会从中读取),并且它无法返回重命名(因为src会写入该内容)。所以我的计划是构建一个Duplex流,它就像这个管道片段的包装器一样,产生了这个:
first = uglify();
last = first
.pipe(header(...))
.pipe(rename(...));
gulp.src('**/*.js')
.pipe(wrapper(first, last) /* writes go to first, reads go to last */)
.pipe(dest('out'));
我已经开始编写一个包装器了,但是我没有足够的节点流体验来了解我正在沿着正确的道路走下去,以及它为什么会这样做。不工作这是我到目前为止所得到的:
var encapsulateStream = function(first, last, logger) {
logger('encapsulate');
let resultStream = new Duplex({
readableObjectMode: true,
writableObjectMode: true,
read(size) {
logger('read');
while (true) {
let chunk = last.read(size);
if (logger) logger('[in]', '--->', chunk);
if (!this.push(chunk) || chunk === null) {
return;
}
}
},
write(chunk, enc, next) {
logger('write');
if (logger) logger('--->', '[first]', chunk);
first.write(chunk, enc, next);
}});
resultStream.on('finish', function() {
logger('finish');
first.end();
forwardStream(last, resultStream, logger);
});
return resultStream;
};
我得到"封装"在我的日志中,但没有别的。我哪里出错了,这是正确的方法吗?
答案 0 :(得分:1)
没有必要自己实施这样的事情。 lazypipe
库被广泛使用,并且几乎完全符合您的要求。
以下是一个快速示例,说明了其用例的用法:
var lazypipe = require('lazypipe');
var doSomething = lazypipe()
.pipe(uglify)
.pipe(header, ...)
.pipe(rename, ...);
gulp.src('**/*.js')
.pipe(doSomething())
.pipe(gulp.dest('out'));