ajax、axios 和 fetch 的区别
核心区别:概念层级不同
-
AJAX(Asynchronous JavaScript and XML):- 本质: 它是一个概念或者说是一种技术思想。它描述了一种使用 JavaScript 在不重新加载整个页面的情况下,与服务器异步交换数据并更新部分网页内容的技术。
- 核心: 关键在于 “Asynchronous”(异步) 和 “XMLHttpRequest” (XHR) 对象。
- 实现方式: 在早期,实现 AJAX 主要依赖浏览器提供的原生
XMLHttpRequest(XHR) 对象。所以很多时候人们会直接把使用 XHR 发送的请求称为 “AJAX 请求”。 - 特点:
- 一个术语/技术模式,不是具体的 API。
- 基于
XMLHttpRequest(XHR) 对象(传统方式)。 - 可以实现异步通信。
- 支持各种数据格式(XML, JSON, text, HTML 等)。
- 兼容性非常好(几乎支持所有现代和较旧的浏览器)。
- API 比较老旧、笨重: 使用回调函数(callback hell),配置和调用相对繁琐。
-
axios:- 本质: 它是一个基于 Promise 的、强大的第三方 HTTP 客户端库。
- 核心: 它是对原生
XMLHttpRequest(XHR) 的封装,提供了更现代、更易用、功能更丰富的 API。 - 特点:
- 基于 Promise: 使用
.then()和.catch()处理异步操作,避免了回调地狱。 - 丰富的功能:
- 请求/响应拦截器: 在请求发出前或响应返回后统一处理逻辑(如添加 token、处理错误)。
- 自动转换 JSON 数据: 请求数据自动序列化,响应数据自动解析 JSON。
- 客户端支持防止 CSRF/XSRF: 提供内置支持。
- 取消请求: 使用
CancelToken或AbortController取消进行中的请求。 - 超时设置: 方便地设置请求超时时间。
- 并发请求: 提供
axios.all和axios.spread辅助方法。 - 浏览器 & Node.js 支持: 在两端都可以运行。
- 更简洁的 API: 语法比原生 XHR 简洁直观得多。
- 兼容性: 内部使用 XHR,兼容性好,但需要作为第三方库引入项目。
- 错误处理更全面: 能捕获 HTTP 状态码错误(如 404, 500)。
- 基于 Promise: 使用
-
fetch:- 本质: 它是现代浏览器提供的原生 JavaScript API,用于发起网络请求,旨在替代传统的
XMLHttpRequest。 - 核心: 提供了一个更现代、基于 Promise 的接口来进行网络操作。
- 特点:
- 原生 API: 浏览器内置,无需额外引入库(在较新浏览器中)。
- 基于 Promise: 使用
.then()和.catch()处理异步操作。 - 更符合现代 JS 风格: 设计上更简洁、模块化。
- 与 Service Workers 集成良好: 是构建 PWA 的基础技术之一。
- 默认不携带 Cookie: 需要显式设置
credentials: 'include'。 - 错误处理机制不同:
fetch只会在网络故障(如无法连接服务器)或请求被明确阻止(如跨域失败)时才会将 Promise 状态变为rejected。- HTTP 错误状态码(如 404, 500)不会导致 Promise 被 reject! 这些响应仍然会被视为“成功的”请求(Promise resolve)。你需要在
.then()里检查response.ok或response.status属性来判断请求是否真正成功。
- 功能相对基础: 原生
fetch本身不提供:- 请求/响应拦截器。
- 自动 JSON 转换(需要手动调用
response.json())。 - 超时设置(需要结合
AbortController实现)。 - 内置的请求取消(需要结合
AbortController实现)。 - 上传进度监控(有实验性支持,但不如 XHR/axios 成熟稳定)。
- 兼容性: 现代浏览器广泛支持,但不支持 IE 及一些非常旧的浏览器。Node.js 环境(如 v18+)也提供了原生
fetch。
- 本质: 它是现代浏览器提供的原生 JavaScript API,用于发起网络请求,旨在替代传统的
总结对比表:
| 特性 | AJAX (概念) / XHR (原生 API) | axios (库) | fetch (原生 API) |
|---|---|---|---|
| 本质 | 技术概念/模式 (通常用 XHR 实现) | 第三方 HTTP 客户端库 (基于 XHR) | 现代浏览器原生 API |
| 核心 API | XMLHttpRequest |
自身简洁的 API (封装 XHR) | window.fetch() |
| 基于 Promise | ❌ (需自行封装) | ✅ | ✅ |
| 简洁性 | ❌ (API 繁琐) | ✅ | ✅ (相对 XHR) |
| JSON 处理 | ❌ (需手动 JSON.parse) |
✅ (自动请求序列化 & 响应解析) | ❌ (需手动 response.json()) |
| HTTP 错误处理 | ❌ (需监听 onreadystatechange 判断) |
✅ (非 2xx 状态码自动 reject) | ❌ (需在 then 中检查 response.ok) |
| 拦截器 | ❌ | ✅ (请求/响应拦截器) | ❌ |
| 取消请求 | ✅ (有原生支持 xhr.abort()) |
✅ (CancelToken / AbortController) |
✅ (需结合 AbortController) |
| 超时设置 | ✅ (原生支持 xhr.timeout) |
✅ (配置简单) | ❌ (需结合 AbortController 模拟) |
| 上传/下载进度 | ✅ (原生支持 progress 事件) |
✅ (基于 XHR 的 progress 事件) |
⚠️ (实验性支持,API 不稳定) |
| CSRF 防护 | ❌ (需手动处理) | ✅ (内置支持) | ❌ (需手动处理) |
| 浏览器兼容性 | ✅ (非常好) | ✅ (好,依赖 XHR) | ⚠️ (现代浏览器好,不支持 IE) |
| Node.js 支持 | ❌ (有类似库 xmlhttprequest) |
✅ | ✅ (Node.js v18+ 原生) |
| 默认携带 Cookie | ✅ | ✅ | ❌ (需 credentials: 'include') |
如何选择?
-
fetch:- 适用于现代浏览器环境的项目(不需要支持 IE)。
- 追求轻量级、原生解决方案,不想引入额外库。
- 只需要基本的网络请求功能。
- 需要与 Service Workers 深度集成。
- 注意: 务必小心处理 HTTP 错误状态码和手动处理 JSON 转换。
-
axios:- 适用于需要兼容旧浏览器(如 IE 11) 的项目。
- 需要丰富的功能(拦截器、取消、自动 JSON、CSRF 防护、进度监控等)。
- 追求简洁、一致且功能强大的 API,提升开发效率和代码可维护性。
- 需要在 浏览器和 Node.js 中共享同一套 HTTP 请求代码。
- 项目已经使用或允许引入第三方库。
-
AJAX (XHR):- 主要在维护非常老的代码库时使用。
- 需要最高级别的浏览器兼容性(包括非常古旧的浏览器)。
- 需要精确控制上传/下载进度且
fetch的支持不能满足需求时。 - 在现代新项目中,通常优先选择
fetch或axios,原生 XHR 直接使用的情况越来越少。
简单来说:
AJAX是你要达到的目标(异步更新网页)。XMLHttpRequest(XHR) 是浏览器提供的、实现AJAX的老工具。fetch是浏览器提供的、实现AJAX的新工具(原生,现代,功能基础)。axios是一个更好用、功能更全的工具箱(基于XHR或http模块封装),让你更方便地实现AJAX,尤其在复杂场景和需要兼容性的情况下。
对于大多数现代前端项目,axios 通常是功能性和开发体验的最佳选择。fetch 是原生且轻量的不错选择,但要注意其特性和兼容性限制。原生 XHR 主要用于历史项目或极少数需要其特有能力的场景。

浙公网安备 33010602011771号