欢迎访问的个人博客:https://swzbk.site/,加好友,拉你入福利群
fetch和
axios` 是前端常用的两种 HTTP 客户端,以下是它们的核心区别及适用场景:
特性 | fetch |
axios |
---|---|---|
类型 | 浏览器原生 API(部分环境需 polyfill) | 第三方库(需通过 npm/yarn 安装) |
底层实现 | 基于 Promise | 基于 Promise,封装了 XMLHttpRequest |
功能 | fetch |
axios |
---|---|---|
基本用法 | fetch(url).then(res => res.json()) |
axios.get(url).then(res => res.data) |
请求配置 | 需手动设置 headers 、method 等参数 |
支持 config 对象统一配置(如 axios({ method, url, data }) ) |
默认响应 | 响应体需手动解析(如 .json() 、.blob() ) |
自动解析为 JSON(res.data 直接获取) |
环境 | fetch |
axios |
---|---|---|
现代浏览器 | 支持(Chrome/Firefox/Edge 等) | 支持 |
旧浏览器(如 IE) | 需单独引入 whatwg-fetch polyfill |
原生支持(基于 XMLHttpRequest) |
功能 | fetch |
axios |
---|---|---|
请求拦截器 | 无内置支持,需手动封装 | 支持 axios.interceptors.request.use() |
响应拦截器 | 无内置支持,需手动封装 | 支持 axios.interceptors.response.use() |
取消请求 | 需使用 AbortController |
内置 CancelToken |
上传进度监听 | 需手动计算(ReadableStream 或第三方库) |
内置 onUploadProgress 回调 |
下载进度监听 | 需手动计算(response.body.pipeThrough() ) |
内置 onDownloadProgress 回调 |
场景 | fetch |
axios |
---|---|---|
网络错误 | 拒绝 Promise(如断网) | 拒绝 Promise |
HTTP 错误状态码 | 不会 拒绝 Promise(需手动检查 res.ok ) |
会 拒绝 Promise(如 404/500 状态码) |
环境 | fetch |
axios |
---|---|---|
浏览器 | 原生支持 | 支持 |
Node.js | 需额外引入(如 node-fetch ) |
原生支持(内置 http /https 模块封装) |
axios
的场景:文件上传/下载:
onUploadProgress
)。FormData
封装+单次请求)。axios.post('/upload', formData, {
onUploadProgress: (e) => console.log(`上传进度:${Math.round((e.loaded/e.total)*100)}%`),
});
复杂交互:
token
、统一错误处理)。axios.all()
)。兼容性要求高:
fetch
的场景:轻量需求:
fetch('/api/data', { method: 'POST', body: JSON.stringify(data) })
.then(res => res.json());
减少依赖:
fetch
)。需求 | 选 axios |
选 fetch |
---|---|---|
上传进度条 | ✅ 内置支持 | ❌ 需手动实现 |
浏览器兼容性(如 IE) | ✅ 原生支持 | ❌ 需 polyfill |
拦截器、取消请求等高级功能 | ✅ 内置支持 | ❌ 需手动封装 |
轻量应用/减少依赖 | ❌ 增加打包体积 | ✅ 原生无依赖 |
Node.js 环境 | ✅ 原生支持 | ❌ 需额外引入模块 |
欢迎访问的个人博客:https://swzbk.site/,加好友,拉你入福利群
`