fetch是浏览器原生轻量API,需手动处理Cookie、状态码、JSON解析等;axios是功能完备的第三方库,内置拦截器、超时、取消请求、自动序列化等特性,开发效率更高。

JavaScript 中发起网络请求,最常用的是 fetch(原生 API)和 axios(第三方库),它们都能发 HTTP 请求,但设计目标、使用方式和能力有明显差异。
fetch 是浏览器原生支持的轻量级 API
fetch 是现代浏览器内置的标准 API,基于 Promise,语法简洁,无需额外引入库。
- 默认不带 Cookie,需显式设置
credentials: 'include'才能携带认证信息 - 400/500 状态码不会自动 reject,需手动检查
response.ok或response.status - 不支持请求/响应拦截、超时控制、取消请求(需配合 AbortController)
- 上传文件时需手动构造 FormData,且对 JSON 自动解析需调用
response.json()
axios 是功能更完整的 HTTP 客户端库
axios 是基于 Promise 的通用 HTTP 库,支持浏览器和 Node.js,封装更友好,开箱即用的功能更多。
- 默认携带 Cookie(取决于环境配置),也支持自定义
withCredentials - HTTP 错误状态(如 404、500)会自动触发 catch,不用手动判断状态码
- 内置请求/响应拦截器,方便统一加 token、处理错误、日志等
- 原生支持超时(
timeout: 5000)、取消请求(CancelToken或AbortController)、自动序列化/反序列化 JSON - 上传进度监听、并发请求(
axios.all)、自动转换请求数据格式(如对象自动转为 JSON)
实际使用时怎么选
如果项目简单、兼容性要求高(如需支持旧版 Safari)、或想减少依赖,用 fetch 更轻量;如果需要统一管理请求逻辑、频繁处理鉴权/错误/加载状态,axios 能显著提升开发效率和可维护性。
立即学习“Java免费学习笔记(深入)”;
注意:fetch 在低版本 iOS Safari 中存在兼容问题,axios 在 Node.js 环境需搭配 axios/adapters/http 使用。
一个对比示例:发送 POST 请求
fetch(需手动处理):
fetch('/api/login', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ username: 'a', password: 'b' }),
credentials: 'include'
})
.then(r => r.json())
.then(data => console.log(data))
.catch(err => console.error(err));
axios(更简洁):
axios.post('/api/login', { username: 'a', password: 'b' }, {
withCredentials: true
})
.then(res => console.log(res.data))
.catch(err => console.error(err));











