跳到主要内容

1 篇博文 含有标签「XMLHttpRequest」

查看所有标签

Fetch 的 response.body 到底特殊在哪:和 XMLHttpRequest 的流式能力边界

· 阅读需 26 分钟

先给结论:

在「浏览器标准里的 HTTP 响应体」这个范围内,这句话基本成立:Fetch 的 Response.body 是一个 ReadableStream,而 XMLHttpRequest 没有直接暴露流对象的能力。

但这句话很容易被读成两个过强的版本,而它们都不对:

  1. 「XHR 完全不能边收边处理」——不对。XHR 在 responseType 为 text 或空字符串时,readyState === 3(LOADING)期间 responseText 会不断增长,你确实可以「边收边处理」文本。只是它给你的是一个不断变长的字符串,不是流对象。
  2. 「只有 Fetch 能产生 ReadableStream」——不对。Blob.stream()、File.stream()、CompressionStream、TransformStream、ReadableStream 构造器都能产生流。准确说法是:在 HTTP 响应体这个位置上,Fetch 是标准里唯一直接把 body 暴露成 ReadableStream 的 API。

这篇就把这句话拆开:Fetch 的 body 模型长什么样,XHR 到底暴露了什么,两者的边界在哪,以及我在 Chrome 里做的一组对照实测。

实测脚本与官方原文留档在 source/fetch-stream-lab/。环境:Chrome 156.0.8078.47、Node v24.14.1、macOS 15.7.3,本机回环,无代理 / CDN。