ajax、axios 和 fetch 的区别

核心区别:概念层级不同

  1. AJAX (Asynchronous JavaScript and XML):

    • 本质: 它是一个概念或者说是一种技术思想。它描述了一种使用 JavaScript 在不重新加载整个页面的情况下,与服务器异步交换数据并更新部分网页内容的技术。
    • 核心: 关键在于 “Asynchronous”(异步)“XMLHttpRequest” (XHR) 对象。
    • 实现方式: 在早期,实现 AJAX 主要依赖浏览器提供的原生 XMLHttpRequest (XHR) 对象。所以很多时候人们会直接把使用 XHR 发送的请求称为 “AJAX 请求”。
    • 特点:
      • 一个术语/技术模式,不是具体的 API。
      • 基于 XMLHttpRequest (XHR) 对象(传统方式)。
      • 可以实现异步通信。
      • 支持各种数据格式(XML, JSON, text, HTML 等)。
      • 兼容性非常好(几乎支持所有现代和较旧的浏览器)。
      • API 比较老旧、笨重: 使用回调函数(callback hell),配置和调用相对繁琐。
  2. axios

    • 本质: 它是一个基于 Promise 的、强大的第三方 HTTP 客户端库
    • 核心: 它是对原生 XMLHttpRequest (XHR) 的封装,提供了更现代、更易用、功能更丰富的 API。
    • 特点:
      • 基于 Promise: 使用 .then().catch() 处理异步操作,避免了回调地狱。
      • 丰富的功能:
        • 请求/响应拦截器: 在请求发出前或响应返回后统一处理逻辑(如添加 token、处理错误)。
        • 自动转换 JSON 数据: 请求数据自动序列化,响应数据自动解析 JSON。
        • 客户端支持防止 CSRF/XSRF: 提供内置支持。
        • 取消请求: 使用 CancelTokenAbortController 取消进行中的请求。
        • 超时设置: 方便地设置请求超时时间。
        • 并发请求: 提供 axios.allaxios.spread 辅助方法。
        • 浏览器 & Node.js 支持: 在两端都可以运行。
      • 更简洁的 API: 语法比原生 XHR 简洁直观得多。
      • 兼容性: 内部使用 XHR,兼容性好,但需要作为第三方库引入项目。
      • 错误处理更全面: 能捕获 HTTP 状态码错误(如 404, 500)。
  3. 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.okresponse.status 属性来判断请求是否真正成功。
      • 功能相对基础: 原生 fetch 本身不提供:
        • 请求/响应拦截器。
        • 自动 JSON 转换(需要手动调用 response.json())。
        • 超时设置(需要结合 AbortController 实现)。
        • 内置的请求取消(需要结合 AbortController 实现)。
        • 上传进度监控(有实验性支持,但不如 XHR/axios 成熟稳定)。
      • 兼容性: 现代浏览器广泛支持,但不支持 IE 及一些非常旧的浏览器。Node.js 环境(如 v18+)也提供了原生 fetch

总结对比表:

特性 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')

如何选择?

  1. fetch

    • 适用于现代浏览器环境的项目(不需要支持 IE)。
    • 追求轻量级、原生解决方案,不想引入额外库。
    • 只需要基本的网络请求功能。
    • 需要与 Service Workers 深度集成。
    • 注意: 务必小心处理 HTTP 错误状态码和手动处理 JSON 转换。
  2. axios

    • 适用于需要兼容旧浏览器(如 IE 11) 的项目。
    • 需要丰富的功能(拦截器、取消、自动 JSON、CSRF 防护、进度监控等)。
    • 追求简洁、一致且功能强大的 API,提升开发效率和代码可维护性。
    • 需要在 浏览器和 Node.js 中共享同一套 HTTP 请求代码。
    • 项目已经使用或允许引入第三方库。
  3. AJAX (XHR)

    • 主要在维护非常老的代码库时使用。
    • 需要最高级别的浏览器兼容性(包括非常古旧的浏览器)。
    • 需要精确控制上传/下载进度fetch 的支持不能满足需求时。
    • 在现代新项目中,通常优先选择 fetchaxios,原生 XHR 直接使用的情况越来越少。

简单来说:

  • AJAX 是你要达到的目标(异步更新网页)。
  • XMLHttpRequest (XHR) 是浏览器提供的、实现 AJAX老工具
  • fetch 是浏览器提供的、实现 AJAX新工具(原生,现代,功能基础)。
  • axios 是一个更好用、功能更全的工具箱(基于 XHRhttp 模块封装),让你更方便地实现 AJAX,尤其在复杂场景和需要兼容性的情况下。

对于大多数现代前端项目,axios 通常是功能性和开发体验的最佳选择fetch 是原生且轻量的不错选择,但要注意其特性和兼容性限制。原生 XHR 主要用于历史项目或极少数需要其特有能力的场景。

posted @ 2025-06-30 11:07  张浩伟  阅读(151)  评论(0)    收藏  举报