在NodeJS中克隆一个转换流



我正在尝试重用几个转换流(gulp-like)。concat()uglify())跨多个可读流。我只能访问创建的实例,而不能访问原始的子类。

它不开箱工作,我得到Error: stream.push() after EOF时,我管道至少两个不同的可读流到我的转换。事件似乎从一个流泄漏到另一个流。

我试图设置一个cloneTransform函数以某种方式清晰地"分叉"成两个不同的转换,但是我不能让它不共享事件:

function cloneTransform(transform) { var ts = new Transform({objectMode: true}); ts._transform = transform._transform.bind(ts); if(typeof transform._flush !== 'undefined') { ts._flush = transform._flush.bind(ts); } return ts; }

有其他的想法,现有的插件或解决方案来解决这个问题吗?


<

更新:上下文/h3>

我正在重写gulp-usemin包,它托管在这里:gulp-usemin-stream,示例使用在这里。

基本上,您解析index.html查找围绕样式/脚本声明的注释块,并且您希望对这些文件应用几个可配置的转换(参见grunt-usemin)。因此,我试图解决的问题是重用转换数组,[concat(), uglify()]作为选项传递给gulp元转换。

你在代码中做不必要的工作。它应该像这样简单:

function clone(transform) {
  var ts = new Transform({ objectMode: true})
  ts._transform = transform._transform
  ts._flush = transform._flush
  return ts
}

然而,我不确定你是如何试图使用它,所以我不确定你得到什么错误。还有初始化的问题,初始转换流可能会用.queue = []或其他东西初始化流,而你不会在克隆中初始化它。

解决方案完全取决于你想要解决的问题,我觉得你一开始就没有正确地处理这个问题。

看起来您正在尝试直接使用Transform流而不是子类化它。您应该做的是继承Transform并覆盖_tranform和(可选的)_flush方法。这样,您就可以为需要使用它的每个可读流创建一个转换流的新实例。

例子:

var util = require('util');
var Transform = require('stream').Transform;
function MyTransform(options) {
    Transform.call(this, options);
    // ... any setup you want to do ...
}
util.inherits(MyTransform, Transform);

MyTransform.protocol._transform = function(chunk, encoding, done) {
    // ... your _transform implementation ...
}
// Optional
MyTransform.protocol._flush = function(done) {
    // ... optional flush implementation ...
}

一旦你有了这个设置,你可以简单地为你想使用它的每个流创建新的MyTransform实例:

var readStream1 = ...
var readStream2 = ...
var transform1 = new MyTransform();
var transform2 = new MyTransform();
readStream1.pipe(transform1).pipe(...);
readStream2.pipe(transform2).pipe(...);

相关内容

  • 没有找到相关文章

最新更新