我正在尝试重用几个转换流(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(...);