完成可写流

时间:2019-02-11 12:27:30

标签: javascript node.js ecmascript-6 stream pipe

我正在使用gulp来处理,缩小和捆绑我的CSS文件(还有js)。但是我不想立即写文件。我想检查处理后的内容的md5总和是否不等于捆绑文件现有版本的md5总和,在这种情况下只能写。

而不是立即写入文件,我尝试从进程中获取字符串。

但是构造无法正常工作。

const Stream = require('stream');
const writableStream = new Stream.Writable({ objectMode: true });

var file = "";

writableStream._write = (chunk, encoding, next) => {
    file += chunk.contents.toString();
    next();
}

let bundlePipe = gulp.src([...vendorLinks.map(e => path.resolve(htmlPath + e)), ...resourceLinks.map(e => path.resolve(htmlPath + e))], { sourcemaps: true })
    .pipe(postcss([cssnext, cssnano]))
    .pipe(concat("style.bundle.min.css"))
    .pipe(writableStream);
    //.pipe(gulp.dest(path.resolve(paths["html/static/css"]))); 


bundlePipe.on("end", () => {
    // It never goes there!
    console.log("get file contents", file); 
}

我创建的writableStream似乎并不知道所有数据都已经传递给它,并且从不发出结束信号。

我该怎么办,以便writableStream在从管道中获取所有数据后将其关闭?

1 个答案:

答案 0 :(得分:0)

可写流不会发出end,只有可读流会发出这种事件。

可写流上的等效项是finish。您可以在Node.js的documentation中找到有关此事件的详细信息。

可读流和可写流具有不同的事件来表示它们已结束/结束的信号的原因是,在混合流(例如DuplexStream)中,还包含一个可读流和一个可写流。同时,因此您需要能够在一种事件与另一种事件之间有所区别。