杰克·阿奇博尔德(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中文网其他相关文章!