如何换行管道流以使其看起来像单个流?

时间:2016-11-08 01:45:18

标签: javascript node.js stream gulp

我有一个工作流程,如下所示:

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;
};

我得到"封装"在我的日志中,但没有别的。我哪里出错了,这是正确的方法吗?

1 个答案:

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