Skip to content

参考:选项全表 / API 速查 / 易错点

基于 WHATWG Fetch 现行标准与各浏览器 Baseline 状态 · 核于 2026-07

速查

  • 签名fetch(resource, options) 返回 Promise<Response>resource 收 URL 字符串 / URL 对象 / Request;参数与 Request() 构造器完全一致,同名选项 fetch() 直传的优先。
  • 头号语义网络失败才 reject(TypeError,HTTP 4xx/5xx 照样 fulfill——response.ok(200–299)必查。
  • 选项默认值method: "GET"mode: "cors"credentials: "same-origin"cache: "default"redirect: "follow"referrer: "about:client"priority: "auto"keepalive: false
  • body 类型:string / ArrayBuffer / TypedArray / DataView / Blob / File / URLSearchParams / FormData / ReadableStream(后者必配 duplex: "half",仅 Chromium);GET/HEAD 带 body 抛 TypeError。
  • 六读方法json() / text() / blob() / arrayBuffer() / bytes()Uint8Array,2025-01 Baseline)/ formData()——全量、异步、单次消费;Request 与 Response 通用。
  • 单次消费bodyUsed 置位后再读抛 TypeError;clone() 必须在任何读取之前(对 bodyUsed 对象克隆同样抛错)。
  • Response 静态三兄弟Response.json(data, init) / Response.error() / Response.redirect(url, status)——SW/mock/边缘函数刚需。
  • type 五值basic(同源)/ cors(跨域白名单头)/ opaque(no-cors:status 0 全读不到)/ opaqueredirect(redirect manual)/ errorResponse.error())。
  • 取消体系AbortController.abort()AbortErrorAbortSignal.timeout(ms)TimeoutError(Chrome 103–123 误抛 AbortError);AbortSignal.any([...]) 组合(2024-03 Baseline),reason 取首个触发源。
  • Headers 规则:名字大小写不敏感、遍历时小写 + 字典序 + 同名合并;getSetCookie() 拿多条 Set-Cookie;fetch 响应头 immutable;禁设头静默忽略。
  • cache 六档default / no-store(不读不写)/ reload(不读但写)/ no-cache(必验证)/ force-cache(过期也用)/ only-if-cached(须配 same-origin,miss 即错)。
  • credentials include 三件套Access-Control-Allow-Credentials: true + ACAO 写具体源(禁 *)+ Cookie 自身 SameSite 放行——缺一不可。
  • integritysha256/384/512-Base64,不匹配按网络错误 reject;priority:high/low/auto 调度提示(2024-10 Baseline)。
  • 离页三件keepalive: true(64 KiB 在途共享配额,2024-11 Baseline)> sendBeacon(老式简配)> fetchLater()(Chrome 135+ 前沿:640 KiB 配额体系、响应不可读、必 catch QuotaExceededError)。
  • 流式response.bodyReadableStream——getReader() 循环全绿;for await Safari 27 才支持;上传流四硬限(half 必填 / 非 303 重定向 reject / 必预检 / 仅 H2 H3)。
  • 错误名速记TypeError 网络层 / AbortError 取消 / TimeoutError 超时 / SyntaxError JSON 解析 / QuotaExceededError fetchLater 配额 / RangeError activateAfter 负值或 bytes 超大。
  • 跨端:同一套 API 覆盖浏览器 / Web Worker / SW / Node 18+(undici)/ Deno / Bun / 边缘运行时。

一、fetch() 选项全表

选项取值(默认说明
methodGET / POST / PUT / DELETE / PATCH / HEAD…no-cors 模式下仅限 GET/HEAD/POST
headersHeaders / 字面量对象 / 二维数组禁设头静默忽略;no-cors 只许 CORS-safelisted(含 Range 禁令)
bodystring / ArrayBuffer / TypedArray / DataView / Blob / File / URLSearchParams / FormData / ReadableStreamGET/HEAD 不可带;其他对象被 toString();FormData 自动生成 multipart 边界
modecors / same-origin / no-cors / navigate跨域总开关;no-cors → opaque 响应
credentialsomit / same-origin / include管 Cookie/TLS 证书/Authorization 的发与收
cachedefault / no-store / reload / no-cache / force-cache / only-if-cachedHTTP 缓存使用策略;only-if-cached 须 same-origin
redirectfollow / error / manualmanual → opaqueredirect(读不到 Location)
referrerabout:client / 同源 URL / ""空串省略 Referer 头
referrerPolicyReferrer-Policy 头九档no-referrerstrict-origin-when-cross-origin
integritysha256-… / sha384-… / sha512-…SRI 校验,失败按网络错误 reject
keepalivetrue / false页面卸载不中断;64 KiB 在途共享配额
signalAbortSignal取消/超时接线;组合用 AbortSignal.any()
priorityhigh / low / auto同类请求间的调度提示(hint)
duplex"half"(body 为流时必填上传流开关,仅 Chromium 105+
targetAddressSpaceloopback / local / publicLocal Network Access:允许 HTTPS 页访问本地地址
attributionReporting / browsingTopics / privateToken对象 / 布尔 / 对象Chromium 隐私沙盒系实验选项(归因上报/Topics/私态令牌),跨浏览器不可用

fetchLater() 额外多一个 activateAfter(毫秒)——最迟等待时长,与页面销毁先到者触发。

二、三对象 API 速查

Request

成员说明
new Request(input, options)fetch() 同参;new Request(oldReq, overrides) 模板派生
method / url / headers基本三件(url 为完整绝对地址)
mode / credentials / cache / redirect / referrer / referrerPolicy / integrity / keepalive / signal策略选项的只读反射
destination请求目标类型("document"/"script"/"image"…),SW 分流常用
body / bodyUsed请求体流 / 是否已消费(发送即消费
clone()克隆(须在读取/发送前);六读方法同 Response

Response

成员说明
new Response(body, { status, statusText, headers })通用构造(SW 合成响应)
Response.json(data, init)静态:JSON 响应一步到位(自动 Content-Type);2026-03 起 Widely
Response.error()静态:网络错误响应(type error、status 0)
Response.redirect(url, status = 302)静态:重定向响应
status / statusText / ok状态码 / 消息 / 200–299 布尔
typebasic / cors / opaque / opaqueredirect / error
url / redirected最终落点 / 是否经历跳转(防开放重定向双查)
headers不可变 Headers(改头需重建 Response)
body / bodyUsed / clone()流 / 消费标记 / 克隆(读前)

Headers

成员说明
new Headers(init)收字面量对象 / 二维数组 / 另一个 Headers
get(name) / has(name)大小写不敏感;同名多值逗号合并返回
set(name, v) / append(name, v) / delete(name)覆盖 / 追加 / 删除——受 guard 限制
getSetCookie()唯一能拿多条 Set-Cookie 的方法(Node/边缘侧用)
entries() / keys() / values() / forEach() / for...of遍历:小写 + 字典序 + 合并

body 读取方法(Request/Response 通用)

方法解析为Baseline备注
text()string全绿多年UTF-8
json()任意 JS 值全绿多年非法/空 body reject
blob()Blob全绿多年URL.createObjectURL()
arrayBuffer()ArrayBuffer全绿多年二进制底座
bytes()Uint8ArrayNewly 2025-01(Firefox 128 / Safari 18 / Chrome 132)老环境等价:new Uint8Array(await r.arrayBuffer())
formData()FormData全绿多年主用于 SW 解析拦截的表单

三、错误分类表

错误类型触发场景处置
TypeError原生错误断网/DNS 失败、URL 非法或带 user:pass@、CORS 被拦、integrity 不匹配、GET 带 body、选项值非法、keepalive 超 64 KiB、redirect: "error" 遇跳转网络类可重试;配置类修代码
AbortErrorDOMExceptioncontroller.abort()(含 fulfill 后读 body 期间);复用已中止 signal预期内流程:静默收尾,勿上报勿重试
TimeoutErrorDOMExceptionAbortSignal.timeout() 到点(Chrome 103–123 误抛 AbortError)提示用户/退避重试
HTTP 4xxfulfill,!ok业务/权限/参数错误按状态码分治;不重试
HTTP 5xx / 429fulfill,!ok服务端故障/限流指数退避 + 抖动重试;尊重 Retry-After
SyntaxErrorreject(读取期)json() 遇非法 JSON(常见:把 404 错误页当 JSON 解析)先查 ok 与 Content-Type
QuotaExceededErrorDOMExceptionfetchLater() 配额超限被 Permissions Policy 限制防御性 catch + keepalive 降级
RangeError原生错误fetchLateractivateAfter 为负;bytes() 数据超出 ArrayBuffer 上限修参数
NotAllowedErrorDOMExceptionbrowsingTopics/privateToken 被 Permissions Policy 禁止隐私沙盒专属,常规业务不遇

四、Baseline 支持时间线

能力关键版本Baseline 状态(核于 2026-07)
fetch/Request/Response/Headers 核心Chrome 42 / Firefox 39 / Safari 10.1Widely available(2017-03 起)
AbortController 取消Chrome 66 / Firefox 57 / Safari 12.1Widely available
AbortSignal.timeout()Chrome 103(124 修 TimeoutError)/ Firefox 100 / Safari 16Widely available
Response.json() 静态Chrome 105 / Firefox 115 / Safari 17Newly 2023-09 → Widely 2026-03
Headers.getSetCookie()Chrome 113 / Firefox 112 / Safari 17Newly 2023-09 → Widely 2026-03
AbortSignal.any()Chrome 116 / Firefox 124 / Safari 17.4Newly available 2024-03
priority 选项Chrome 101 / Safari 17.2 / Firefox 132 补齐Newly available 2024-10
keepalive 选项Chrome 66 / Safari 13 / Firefox 133 补齐Newly available 2024-11
bytes()Firefox 128 / Safari 18.0 / Chrome 132 补齐Newly available 2025-01
for await 遍历 ReadableStreamChrome 124 / Firefox 110 / Safari 27 未发布非 Baseline(getReader 循环替代)
上传流(duplex: "half"Chromium 105 / Node 18.13非 Baseline(Firefox/Safari 未实现)
fetchLater()Chrome/Edge 135(2025-04)非 Baseline(仅 Chromium,experimental)

五、选型对比:fetch vs XHR vs 封装库

维度原生 fetchXMLHttpRequestAxiosky / ofetch
异步模型Promise事件回调PromisePromise
底座XHR(支持 fetch adapter)fetch
HTTP 错误fulfill,自查 okonload,自查 status自动 reject 非 2xx自动 reject 非 2xx
拦截器/hooksinterceptors 体系hooks(ky)/ 拦截选项(ofetch)
重试/超时手写(AbortSignal)timeout 属性需插件/手配内建 retry + timeout
自动 JSON手动两步手动自动自动
上传进度缺位(流式仅 Chromium)原生 onprogress有(XHR adapter 下)
响应流式一等公民受限透传 fetch 能力
SW/Cache/边缘运行时一等公民不可用部分可用
体积00较大
适用简单场景/平台集成/流式仅存量 + 上传进度大型项目统一治理/老浏览器现代项目的轻治理层

六、易错点清单

  • 不查 response.ok 直接 json():404 错误页进 JSON 解析器,收获 SyntaxError——头号易错点,两步走不能省。
  • 在 catch 里等 HTTP 错误:4xx/5xx 根本不进 catch——错误分流三层走(网络/取消/HTTP)。
  • body 读两次bodyUsed 后抛 TypeError——先 clone(),且克隆必须发生在读取前。
  • 带 body 的 Request 发两次:发送即消费——同样先 clone。
  • 204/空响应调 json():解析必炸——先看 status/Content-Length。
  • FormData 手设 Content-Type:丢 boundary——交给浏览器。
  • GET 塞 body:TypeError——查询串用 URLSearchParams
  • no-cors 当 CORS 偏方:opaque 响应 status 0 全读不到,成败都无从判断——服务端配头才是正解。
  • credentials: "include" 服务端只配 ACAO *:凭据模式禁通配——具体源 + Access-Control-Allow-Credentials: true
  • include 了 Cookie 还是不发SameSite=Lax/Strict 另一道闸——两套都要过。
  • headers 里写 Cookie/Origin/Referer:禁设头静默忽略——凭据走 credentials,Referer 走 referrer 选项。
  • 跨域读自定义响应头读不到:CORS 响应头白名单——服务端 Access-Control-Expose-Headers
  • 改 fetch 响应的 headers:immutable 抛 TypeError——new Response(old.body, {...}) 重建。
  • 复用已 abort 的 signal / timeout 信号放重试循环外:新请求秒 reject——每轮新建。
  • AbortError 灌进错误监控:取消是预期流程——按 err.name 过滤。
  • 只认 TimeoutError 忘了 Chrome 103–123:老版超时抛 AbortError——双兜底。
  • 4xx 重试 / POST 无幂等键重试:业务错重试无意义;超时 ≠ 未送达,重复下单事故——只重试网络类与 5xx/429,POST 配 Idempotency-Key
  • for await 遍历 body 不检测:Safari 27 前不支持——getReader() 循环。
  • 流式解码不带 stream: true:多字节字符跨块乱码——decode(value, { stream: true }) + 结尾冲刷。
  • 进度条超 100%:Content-Length(压缩后)对 read() 字节(解压后)——统一口径或降级不确定态。
  • keepalive 报文超 64 KiB:立即 TypeError 且配额在途共享——压缩/采样/拆分。
  • fetchLater 裸调不 catchQuotaExceededError 随时可能(第三方共享配额)——防御性捕获 + keepalive 降级。
  • only-if-cached 不配 same-origin:TypeError——绑定出现。
  • 以为 redirect: "manual" 能拿 Location:opaqueredirect 全滤——用 redirected/url 事后校验。

七、权威链接