我怎样才能写一个简单的吞咽pipefunction?

我一直在努力一天写两个pipe道function,一个编译较less的文件,另一个连接这些文件。 我想学习如何为更复杂的插件编写转换stream/pipe道。

所以我想知道如何从另一个pipe道读取数据,以及如何改变这些数据并将其发送到下一个pipe道。 这是我迄今为止:

gulp.src(sources) .pipe(through.obj(function (chunk, enc, cb) { var t = this; // console.log("chunk", chunk.path); fs.readFile(chunk.path, enc, function (err,data) { if (err) { cb(err); } less.render(data, { filename : chunk.path, sourceMap : { sourceMapRootpath : true } }) .then(function (outputCss) { // console.log("less result",outputCss); t.push(chunk);// or this.push(outputCss) same result cb(); }); }); })) .pipe(through.obj(function (chunk, enc, cb) { console.log("chunk", chunk.path); // not event getting called. cb(); })) 

我无法获得第二个pipe道中每个文件的outputCSS。 我怎么发送它?

那么,你不需要在这里使用fs ,你已经得到了文件stream(在这里你的chunk )。

还有一点,你不是把文件发回给pipe道,所以我想这就是为什么你的第二个文件没有被调用。

 var through = require('through2') gulp.src(sources) .pipe(through.obj(function (chunk, enc, cb) { console.log('chunk', chunk.path) // this should log now cb(null, chunk) })) 

在ES2015中:

 import through from 'through2' gulp.src(sources) .pipe(through.obj((chunk, enc, cb) => cb(null, chunk))) 

而对于你的具体例子:

 .pipe(through.obj(function (file, enc, cb) { less.render(file.contents, { filename: file.path, ... }) // add other options .then(function (res) { file.contents = new Buffer(res.css) cb(null, file) }) })) 

这仍然是非常基本的,我不检查错误,如果它不是一个stream等,但这应该给你一些你错过了什么暗示。