前端网络请求详解:AJAX、XHR、Fetch、Axios、Beacon 的区别

一、什么是前端网络请求?

在前端开发中,我们经常需要向服务器获取数据或提交数据,例如查询用户信息、提交登录表单、上传文件等。

AJAX、XHR、Fetch、Axios、Beacon 都与网络请求有关,但它们并不是五种完全独立的请求方式。

其中 AJAX 是一种技术思想,其他四个则是具体的 API 或工具。

二、AJAX:异步请求技术

AJAX(Asynchronous JavaScript and XML)是一种通过 JavaScript 异步与服务器交换数据,并在不刷新整个页面的情况下更新网页的技术。

例如,用户点击查询按钮,网页向服务器请求数据,获取结果后只更新列表,而不需要重新加载整个页面。

AJAX 本身不是具体的函数,也不是第三方库。

早期主要通过 XMLHttpRequest 实现,现在也可以通过 Fetch、Axios 等工具实现 AJAX 式交互。

三、XHR:传统原生请求 API

XMLHttpRequest(简称 XHR)是浏览器原生提供的 HTTP 请求 API,也是早期实现 AJAX 的主要方式。

复制代码
const xhr = new XMLHttpRequest()

// 配置请求
xhr.open('GET', '/api/user')

// 注册响应处理函数
xhr.onload = () => {
  console.log(xhr.responseText)
}

// 发送请求
xhr.send()

执行过程:

  1. new XMLHttpRequest():创建请求对象。

  2. open():设置请求方法和地址。

  3. onload:注册加载完成的回调函数。

  4. send():发送请求。

特点: 功能成熟,支持上传进度监听等能力,但传统写法基于事件回调,使用起来相对繁琐。

四、Fetch:现代原生请求 API

Fetch 是浏览器原生的 HTTP 请求 API,基于 Promise,支持 async/await。

复制代码
async function getUser() {
  const res = await fetch('/api/user')

  if (!res.ok) {
    throw new Error('请求失败')
  }

  const data = await res.json()

  console.log(data)
}

需要注意:

  • fetch() 返回 Promise。

  • await 等待请求响应。

  • res.json() 将 JSON 响应体解析成 JS 数据。

  • res.ok 用于判断 HTTP 状态码是否在 200~299 之间。

特点: 原生支持、无需安装第三方库、语法简洁。

缺点: HTTP 404、500 等响应默认不会让 Promise reject,需要手动判断状态码;请求拦截等功能通常需要自行封装。

五、Axios:第三方 HTTP 请求库

Axios 是一个基于 Promise 的第三方 HTTP 请求库,封装了常见的网络请求功能。

例如:

复制代码
import axios from 'axios'

async function getUser() {
  const res = await axios.get('/api/user')

  console.log(res.data)
}

与 Fetch 相比:

复制代码
// Fetch
const res = await fetch('/api/user')
const data = await res.json()

// Axios
const res = await axios.get('/api/user')
const data = res.data

Axios 的主要优势:

  • 自动处理常见 JSON 响应。

  • 支持请求和响应拦截器。

  • 方便统一配置 baseURL、超时时间等。

  • 默认将非 2xx HTTP 响应视为错误。

  • 支持取消请求、上传进度监听等功能。

特点: 封装完善,适合 React、Vue 等项目中的业务接口管理。

注意:Axios 并不是一种新的网络协议,它底层仍依赖运行环境提供的 HTTP 请求能力,例如 XHR 或 Fetch 适配器。

六、Beacon:轻量数据上报 API

Beacon API 主要用于向服务器异步发送少量数据,特别适合日志、埋点、性能监控等场景。

例如,用户离开页面时,需要向服务器上报访问数据。

复制代码
const data = {
  event: 'page_leave',
  duration: 5000
}

const blob = new Blob(
  [JSON.stringify(data)],
  { type: 'application/json' }
)

navigator.sendBeacon('/api/log', blob)

与普通请求不同:

  • 只支持 POST 请求。

  • 不提供读取服务器响应内容的能力。

  • 适合页面进入后台时发送少量数据。

  • 浏览器会尽力在页面卸载后继续发送已排队的数据。

例如监听页面隐藏事件:

复制代码
document.addEventListener('visibilitychange', () => {
  if (document.visibilityState === 'hidden') {
    navigator.sendBeacon('/api/log', blob)
  }
})

注意: sendBeacon() 返回 true 仅代表数据成功加入发送队列,不代表服务器一定收到。

七、五者的核心区别

对比 本质 主要特点 适用场景
AJAX 异步交互技术 不刷新整个页面即可交换数据 异步交互思想
XHR 浏览器原生 API 事件回调、支持进度监听 传统请求、上传进度
Fetch 浏览器原生 API Promise、async/await 现代普通 HTTP 请求
Axios 第三方请求库 自动 JSON 处理、拦截器、统一配置 Vue、React 业务接口
Beacon 浏览器原生 API POST、无需处理响应、适合后台发送 日志、埋点、监控上报

需要特别注意:AJAX 不是与 XHR、Fetch、Axios 平级的独立底层 API,而是一种异步请求和页面局部更新的技术思想。

八、面试背诵版

AJAX 是一种通过 JavaScript 异步与服务器交换数据、实现页面局部更新的技术思想。

XHR 是早期实现 AJAX 的主要原生 API,基于事件回调,功能成熟,但使用相对繁琐。

Fetch 是现代浏览器原生的请求 API,基于 Promise,支持 async/await,但需要手动解析响应体,并自行判断 HTTP 错误状态。

Axios 是第三方 HTTP 请求库,封装了自动 JSON 处理、请求和响应拦截器、超时控制、统一配置等功能,适合项目中的业务接口请求。

Beacon 是专门用于轻量数据上报的浏览器 API,通常用于日志、埋点和性能监控,支持在页面进入后台时安排发送数据,但无法获取响应内容。

一句话总结:AJAX 是思想,XHR 是传统原生实现,Fetch 是现代原生请求 API,Axios 是封装完善的第三方请求库,Beacon 则是专门用于轻量数据上报的 API。

相关推荐
MindUp1 小时前
多人会议音视频听记:支持说话人区分的工具使用观察
1024程序员节
Mr.Pascal1 小时前
Javascript之什么是作用域?
javascript·1024程序员节
weipt1 小时前
关于视频对讲项目的研究对比:LiveKit / Jitsi / SRS
视频会议·1024程序员节·视频推流·视频对接
xixiaoyunya1 小时前
网页状态实时提醒:把故障从“事后处理”变成“即时响应”
1024程序员节
Be for thing1 小时前
PyCharm安装与PyTorch项目配置|Jupyter Notebook与PyCharm使用对比
pytorch·学习·1024程序员节
weixin_440401691 小时前
大数据技术-人工智能编程题
大数据·人工智能·python·1024程序员节
代码不停1 小时前
分布式链路追踪 SkyWalking介绍
skywalking·1024程序员节
AIyy8661 小时前
学习资料分类整理的知识库工具使用思路:从统一入口到本地沉淀
1024程序员节
倔强的石头1061 小时前
模型合并技术_SLERP_TIES_Merge_DARE
人工智能·1024程序员节