NodeJs Stream的整理總結 (二) --雙工流Duplex和Transform
對於流我其實並沒有很複雜的操作經驗,文章只是先把要點錄下來,以後有了更深的思考可以在此基礎上新增更多的內容。
這篇文章我認為對初步理解雙工流很有幫助:
本質上Transform是Duplex的一種,官方文件的描述也明確指出了這一點:
Duplex流定義
Duplex streams are streams that implement both the Readable and Writable interfaces.
Examples of Duplex streams include:
- TCP sockets
- zlib streams
- crypto streams
Transfrom流定義
Transform streams are Duplex streams where the output is in some way related to the input. Like all Duplex streams, Transform streams implement both the Readable and Writable interfaces.
Examples of Transform streams include:
- zlib streams
crypto streams
通過上面的定義,我們可以用下圖來表示Duplex和Transform流的關係:
自定義Duplex
- 繼承 Duplex 類
- 實現 _read() 方法
- 實現 _write() 方法
自定義Transform
stream.Transform類最初繼承自stream.Duplex,並且實現了它自己版本的writable._write()和readable._read()方法。
一般地,變換流必須實現transform._transform() 方法; 而transform._flush() 方法是非必須的。
Duplex和Transform例項對比:Tcp Socket vs Gulp
這裡直接引用篇頭參考文章的例子了:
Tcp Socket
var net = require('net');
//建立客戶端
var client = net.connect({port: 1234}, function() {
console.log('已連線到伺服器');
client.write('Hi!');
});
//data事件監聽。收到資料後,斷開連線
client.on('data', function(data) {
console.log(data.toString());
client.end();
});
//end事件監聽,斷開連線時會被觸發
client.on('end', function() {
console.log('已與伺服器斷開連線');
});
可以看到 client 就是一個 Duplex,可寫流用於向伺服器傳送訊息,可讀流用於接受伺服器訊息,兩個流內的資料並沒有直接的關係。
Gulp
gulp.src('client/templates/*.jade')
.pipe(jade())
.pipe(minify())
.pipe(gulp.dest('build/minified_templates'));
其中 jada() 和 minify() 就是典型的 Transform,處理流程大概是:
.jade 模板檔案 -> jada() -> html 檔案 -> minify -> 壓縮後的 html
可以看出來,jade() 和 minify() 都是對輸入資料做了些特殊處理,然後交給了輸出資料。
這樣簡單的對比就能看出 Duplex 和 Transform 的區別,在平時實用的時候,當一個流同事面向生產者和消費者服務的時候我們會選擇 Duplex,當只是對資料做一些轉換工作的時候我們便會選擇使用 Tranform。
相關文章
- NodeJs Stream的整理總結 (一) --可讀流與可寫流NodeJS
- Nodejs教程24:Stream流NodeJS
- Nodejs 實踐 -- Stream 流NodeJS
- NODE Stream流總結(1)
- NODE Stream流總結(2)
- 淺析nodejs中的stream(流)NodeJS
- 瞭解nodeJs中的流(stream)NodeJS
- Node.js Stream(流)總結Node.js
- NodeJS stream 流 原理分析(附原始碼)NodeJS原始碼
- NodeJS Stream(可讀流、可寫流) API解讀NodeJSAPI
- [VUE系列二]vue官方文件總結和整理Vue
- Java基礎 | Stream流原理與用法總結Java
- Java-Stream流方法學習及總結Java
- Node.js Stream 流的使用及實現總結Node.js
- nodeJs檔案系統(fs)與流(stream)NodeJS
- [elixir! #0083] Stream.transform 的用法ORM
- nodejs的stream模組NodeJS
- Nodejs中的stream模組NodeJS
- nodejs面試總結NodeJS面試
- 丐版stream流理解和使用
- Stream流
- nodeJS基礎 Stream用法NodeJS
- NLP知識總結和論文整理
- Javaweb整理總結JavaWeb
- node中的流(stream)
- Stream流求和
- 簡單認識和使用node 中的流(stream)
- LC演算法技巧總結(二):雙指標和滑動視窗技巧演算法指標
- 流(stream):可讀流篇
- Java8 新特性 Stream流操作List集合 (二)Java
- java的Stream流學習Java
- xPath 用法總結整理
- java-Stream流Java
- Stream 流模組
- stream流各種
- Java Stream流使用Java
- 資料結構與演算法整理總結---二分查詢資料結構演算法
- nodeJs流的使用及原理NodeJS