2016-11-08 5 views
0

私は、このような何かの作業の流れを持っている:私はdoSomethingがストリームパイプラインを返すようにしたいパイプストリームを単一のストリームのようにするにはどうすればよいですか?

gulp.src('**/*.js') 
    .pipe(doSomething()) 
    .pipe(dest('out')); 

をこれの効果的な結果が明らかに

gulp.src('**/*.js') 
    .pipe(uglify()) 
    .pipe(header(...)) 
    .pipe(rename(...)) 
    .pipe(dest('out')); 

doSomething缶になるようuglify().pipe(header(...)).pipe(rename(...))ようなことを言います'tはuglifyを返します(destはそれを読み込むので)、名前を返すことはできません(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')); 

私が正しい道をまっすぐに進んでいること、なぜそれが機能していないのかを知る経験。ここに私がこれまでに持っているものは次のとおりです:

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

あなたがしようとしている何のためのlibがすでにあります - > [ 'lazypipe'](HTTPS://www.npmjs .com/package/lazypipe) –

+0

コメントを確認できるようにコメントにしてください。 – Hounshell

答えて

1

このような方法を自分で実装する必要はありません。 lazypipeライブラリは広く使われており、あなたが望むものとほとんど同じです。ここで

は、ユースケースのためにその使用法を示して簡単な例です:

var lazypipe = require('lazypipe'); 

var doSomething = lazypipe() 
    .pipe(uglify) 
    .pipe(header, ...) 
    .pipe(rename, ...); 

gulp.src('**/*.js') 
    .pipe(doSomething()) 
    .pipe(gulp.dest('out')); 
関連する問題