Как написать простую функцию трубки gulp?
В течение дня я пытался написать две функции конвейера, одна из которых компилирует меньше файлов, а другая объединяет эти файлы. Я хочу научиться писать потоки/каналы преобразования для более сложных плагинов.
Поэтому я хочу знать, как читать данные из другого канала и как изменять эти данные и отправлять их в следующий канал. Это то, что я до сих пор:
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();
}))
Я не могу получить outputCSS
для каждого файла во втором канале. Как я могу отправить это?
Ответы
Ответ 1
Ну, вам здесь не нужно использовать fs
, у вас уже есть поток файла (здесь ваш chunk
).
Еще один момент: вы не отправляете обратно в канал файлы, поэтому я предполагаю, что почему ничего не вызывается на втором.
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)
})
}))
Это все еще довольно просто, я не проверяю ошибки, если это не поток и т.д., но это должно дать вам некоторый намек на то, что вы пропустили.