首页 > web前端 > css教程 > 到处都是网络流(并获取node.js)

到处都是网络流(并获取node.js)

Jennifer Aniston
发布: 2025-03-19 10:01:08
原创
878 人浏览过

到处都是网络流(并获取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
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板