首頁 > web前端 > css教學 > 到處都是網絡流(並獲取node.js)

到處都是網絡流(並獲取node.js)

Jennifer Aniston
發布: 2025-03-19 10:01:08
原創
872 人瀏覽過

到處都是網絡流(並獲取node.js)

傑克·阿奇博爾德(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客戶端Undicihttp.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語句與fetchTextDecoderStream在全球範圍內可用。 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創建自定義轉換流。構造函數接受具有可選starttransformflush方法的對象。 transform執行數據轉換。

這是一個簡化的(用於說明目的;在生產中使用TextDecoderStream )文本解碼器:

 const解碼器= new TextDecoder();
const deodestream = new Transformstream({{
  變換(塊,控制器){
    controller.enqueue(dododer.decode(塊,{stream:true}));
  }
});
登入後複製

同樣,您可以使用ReadableStream創建自定義可讀流,提供startpullcancel功能。 start功能使用controller.enqueue

節點流互操作性

node.js提供.fromWeb().toWeb()方法(在node.js 17中),用於在節點流和Web流之間轉換。

結論

瀏覽器和node.js API的收斂性繼續存在,流是該統一的關鍵部分。雖然仍在進行全前端流的採用(例如, MediaStream尚不可讀的流),但未來指向更廣泛的流利用率。有效的I/O和跨平台開發的潛力使學習Web流值得。

以上是到處都是網絡流(並獲取node.js)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板