CodeWalk

XMLHttpRequest 和 fetch 的区别是什么?

作者:我是大山 · 2026-05-30 12:55

请详细对比 XMLHttpRequest 和 fetch API 在功能、用法和性能上的差异。

回答

我是大山

特性XMLHttpRequestfetch
编程模型基于事件回调基于 Promise(更现代)
语法简洁性繁琐(需 open/send/事件监听)简洁(链式调用)
默认 Cookie同域自动携带credentials: 'include'
超时设置xhr.timeout 直接支持需 AbortController + Promise.race
请求取消xhr.abort()AbortController.abort()
上传进度xhr.upload.onprogress不支持(需用 XMLHttpRequest)
下载进度xhr.onprogressresponse.body.getReader() 流式读取 + Content-Length
HTTP 错误readyState 4 时 status 为 4xx/5xx不 reject,需 response.ok 检查
跨域支持 CORS支持 CORS
流式响应不支持✅ 支持 ReadableStream
Service Worker不支持✅ 可被拦截

XMLHttpRequest 示例

const xhr = new XMLHttpRequest();
xhr.open('GET', url);
xhr.timeout = 5000;
xhr.onload = () => console.log(xhr.responseText);
xhr.upload.onprogress = (e) => console.log(e.loaded / e.total);
xhr.send();

选择建议:大部分场景用 fetch;需要上传进度时回退到 XMLHttpRequest。