2015-01-13 23 views
40

我一直在嘗試寫一天編寫兩個管道功能,一個編譯較少的文件,另一個連接這些文件。我想學習如何爲更復雜的插件編寫轉換流/管道。如何編寫簡單的吞嚥管功能?

因此,我想知道如何從另一個管道讀取數據,以及如何更改該數據並將其發送到下一個管道。這是我到目前爲止:

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。我怎樣才能發送它?

+0

https://github.com/gulpjs/gulp/blob/master/docs/writing-a-plugin/dealing-with-streams.md可能會幫助一些人。 – Shanimal

回答

42

那麼,你不需要在這裏使用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) 
    }) 
})) 

這仍然是非常基本的,我不檢查錯誤,如果它不是一個流等等,但是這應該給你一些你錯過的東西的提示。

+0

感謝您花時間回答我的問題。我從你的代碼中瞭解到,文件對象內容需要被一個由less生成的css字符串的緩衝區替換,爲了將它發送到下一個管道變換/寫入實例,我需要傳遞該文件作爲第二個cb函數的參數。我今天會試試看看它是如何工作的。 –

+1

@vsync簡單_in gulp_,它可能會更容易在不同的語言 –

+0

@vsync這個詞將是基本的,不簡單,我猜。大多數吞吐管道功能需要通過它們以這種方式發送數據。 –