fetch是浏览器原生轻量API,需手动处理Cookie、状态码、JSON解析等;axios是功能完备的第三方库,内置拦截器、超时、取消请求、自动序列化等特性,开发效率更高。
JavaScript 中发起网络请求,最常用的是 fetch(原生 API)和 axios(第三方库),它们都能发 HTTP 请求,但设计目标、使用方式和能力有明显差异。
fetch 是现代浏览器内置的标准 API,基于 Promise,语法简洁,无需额外引入库。
credentials: 'include' 才能携带认证信息
状态码不会自动 reject,需手动检查 response.ok 或 response.status
response.json()
axios 是基于 Promise 的通用 HTTP 库,支持浏览器和 Node.js,封装更友好,开箱即用的功能更多。
withCredentials
timeout: 5000)、取消请求(CancelToken 或 AbortController)、自动序列化/反序列化 JSONaxios.all)、自动转换请求数据格式(如对象自动转为 JSON)如果项目简单、兼容性要求高(如需支持旧版 Safari)、或想减少依赖,用 fetch 更轻量;如果需要统一管理请求逻辑、频繁处理鉴权/错误/加载状态,axios 能显著提升开发效率和可维护性。
注意:fetch 在低版本 iOS Safari 中存在兼容问题,axios 在 Node.js 环境需搭配 axios/adapters/http 使用。
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));