我有一个工作流程,像这样:
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会从中读取),也不能返回rename(因为src会向其写入)。因此,我的计划是构建一个双工流,它就像这个管道片段的包装器一样,导致如下:
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'));
我试着写了一个包装器,但是我没有足够的Node Stream经验来知道我在走正确的道路,以及为什么它不起作用。以下是我目前得到的:
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;
};
我在我的日志中得到"封装",但没有其他。我哪里做错了,这是正确的方法吗?
没有必要自己实现这样的东西。lazypipe
库被广泛使用,并且可以完全满足您的需求。
下面是一个快速示例,说明了它在您的用例中的用法:
var lazypipe = require('lazypipe');
var doSomething = lazypipe()
.pipe(uglify)
.pipe(header, ...)
.pipe(rename, ...);
gulp.src('**/*.js')
.pipe(doSomething())
.pipe(gulp.dest('out'));