如何包装管道流,使其看起来像单个流



我有一个工作流程,像这样:

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'));

相关内容

  • 没有找到相关文章

最新更新