傑克·阿奇博爾德(Jake Archibald)2016年對“網絡流”一年的預測可能略高於其時代。但是,目前最初提出的溪流標準是現實,它始終在現代瀏覽器(Firefox趕上)和Node.js(和Deno)之間實施。
流媒體通過將它們分解成較小的“塊”並順序處理它們來有效地處理大型數據資源。這避免在處理開始之前等待完整的下載,從而實現漸進數據處理。
存在三種主要流類型:可讀,可寫和變換流。可讀的流提供數據塊(來自文件或HTTP連接等源)。變換流(可選)修改這些塊。最後, Writable Streams接收處理後的數據。
Node.js最初具有自己的流實現,通常被認為是複雜的。 WhatWG Web標準的流提供了重大改進,現在稱為Node.js文檔中的“ Web Streams”。在原始Node.js流仍然存在時,Web標準API並存,促進跨平台代碼並簡化開發。
Deno,也由Node.js的原始作者創建,完全支持Web流,鏡像瀏覽器API。 Cloudflare工人和DENO部署還利用了這種標準化方法。
fetch()
和可讀流創建可讀流的最常見方法是使用fetch()
。 fetch()
調用的response.body
。
fetch('data.txt') 。
控制台日誌揭示了幾種有用的流方法。如規範所述,可以使用pipeTo()
直接將可讀的流直接管道到可寫的流,也可以使用pipeThrough()
通過變換流進行管道。
Node.js Core缺乏內置的fetch
支持。 node-fetch
(一個流行的庫)返回節點流,而不是Whatwg流。來自Node.js團隊的較新的HTTP/1.1客戶端Undici
為http.request
提供了現代替代方案,提供了一個fetch
實現,其中response.body
確實返回了網絡流。 Undici
可能會成為Node.js中推薦的HTTP請求處理程序。安裝後( npm install undici
),它的功能與瀏覽器fetch
類似。下面的示例通過轉換流將流提供流動:
從'undici'導入{fetch}; 從'node:stream/web'導入{textDecoderStream}; 異步函數fetchStream(){ const響應=等待提取('https://example.com'); const流=響應。 const textstream = stream.pipethrough(新的textDecoderStream()); // ...文本流的進一步處理... }
response.body
Body是同步的;不需要await
。瀏覽器代碼幾乎是相同的,省略了import
語句與fetch
和TextDecoderStream
在全球範圍內可用。 Deno也有本地支持。
for-await-of
循環提供了異步迭代,將for-of
的功能擴展到異步迭代(例如流和諾言的陣列)。
異步函數fetchandlogstream(){ const響應=等待提取('https://example.com'); const流=響應。 const textstream = stream.pipethrough(新的textDecoderStream()); 等待(textstream的const塊){ console.log(塊); } } fetchandlogstream();
這在Node.js,DeNo和Modern瀏覽器中起作用(儘管瀏覽器流支持仍在開發中)。
雖然fetch()
很普遍,但其他方法創建可讀的流: Blob.stream()
和File.stream()
(需要import { Blob } from 'buffer';
)。在瀏覽器中,一個<input type="file">
元素很容易提供文件流:
const fileStream = document.queryselector('input')。文件[0] .stream();
node.js 17從fs/promises.open()
FileHandle.readableWebStream()
):
從'node:fs/promises'導入{open}; // ...(打開文件和過程流)...
對於流過後完成措施,承諾很有用:
somereadableStream 。 。 .catch(error => console.error(“ error”,error));
或使用await
:
等待somereadableStream.pipeto(somewritableStream);
除了TextDecoderStream
(和TextEncoderStream
)之外,您還可以使用TransformStream
創建自定義轉換流。構造函數接受具有可選start
, transform
和flush
方法的對象。 transform
執行數據轉換。
這是一個簡化的(用於說明目的;在生產中使用TextDecoderStream
)文本解碼器:
const解碼器= new TextDecoder(); const deodestream = new Transformstream({{ 變換(塊,控制器){ controller.enqueue(dododer.decode(塊,{stream:true})); } });
同樣,您可以使用ReadableStream
創建自定義可讀流,提供start
, pull
和cancel
功能。 start
功能使用controller.enqueue
。
node.js提供.fromWeb()
和.toWeb()
方法(在node.js 17中),用於在節點流和Web流之間轉換。
瀏覽器和node.js API的收斂性繼續存在,流是該統一的關鍵部分。雖然仍在進行全前端流的採用(例如, MediaStream
尚不可讀的流),但未來指向更廣泛的流利用率。有效的I/O和跨平台開發的潛力使學習Web流值得。
以上是到處都是網絡流(並獲取node.js)的詳細內容。更多資訊請關注PHP中文網其他相關文章!