为何Web Streams API未包含Duplex Stream?
我熟悉Node.js旧版的Duplex流(比如net.Socket),这类兼具可读与可写特性的流需求确实很明确——Node.js文档里也把TCP套接字、zlib流、crypto流都归为Duplex流的典型场景。但在Node.js 18引入的Web Streams API里,确实没有对应Duplex的类型,这本质上是WHATWG规范和Node.js流的设计目标、场景差异导致的:
设计场景与平台差异
Web Streams API最初是为浏览器环境设计的,浏览器里的双向通信场景(比如WebSocket),天然可以拆分为"接收数据的可读流"和"发送数据的可写流"两个独立部分。分开处理反而更贴合浏览器的异步模型,也符合Web平台的模块化设计思路,不需要把两者强行封装成一个单一对象。遵循单一职责原则
WHATWG规范的核心设计哲学是让每个流类型职责单一:- 可读流(ReadableStream):专注处理数据的读取、背压控制、错误处理
- 可写流(WritableStream):专注处理数据的写入、背压控制、错误处理
- 转换流(TransformStream):专注处理数据的转换逻辑
这种拆分让每个组件的逻辑更清晰,组合起来也更灵活——比如你可以把一个可读流的数据经过转换后写入多个可写流,或者把多个可读流的数据合并后写入一个可写流,这些场景下单一职责的流比Duplex流更易用。
Duplex流的功能可通过组合实现
Web Streams虽然没有原生的Duplex类型,但完全可以通过组合两个独立的流来模拟其功能。比如你可以创建一个对象,同时包含一个ReadableStream实例和一个WritableStream实例,分别处理读写逻辑,这种方式比封装好的Duplex流更透明,你可以独立控制两个流的背压、状态和错误处理逻辑。Node.js流与Web Streams的兼容方案
如果你需要在Node.js里同时使用Web Streams和Duplex流的特性,Node.js提供了转换工具:可以用stream.web.toWeb()把Node.js的Duplex流转换成Web Streams的可读/可写流对,也可以用stream.web.fromWeb()把Web Streams转换回Node.js的流类型,满足双向场景的需求。
内容的提问来源于stack exchange,提问作者Qiulang

