当前位置: 首页 > news >正文

jQuery AJAX、Axios与Fetch

jQuery AJAX、Axios与Fetch对比

Web请求技术对比
jQuery AJAX
Axios
Fetch API
基于XHR\n兼容性好\n需引入jQuery
基于Promise\n功能丰富\n第三方库
浏览器原生API\n语法现代\n功能较简单

⭐ 三者特点详解

1️⃣ jQuery AJAX

// jQuery AJAX请求示例
$.ajax({url: '/api/users',method: 'GET',dataType: 'json',success: function(data) {console.log('成功:', data);},error: function(xhr, status, error) {console.error('错误:', error);}
});

核心特点:

  • ✅ 兼容性极佳,支持IE6+等老旧浏览器
  • ✅ 语法简洁,配置灵活
  • ✅ 丰富的事件处理(success, error, complete等)
  • ❌ 需要引入整个jQuery库(体积大)
  • ❌ 基于回调,不支持Promise(旧版本)
  • ❌ 现代项目中逐渐被淘汰

2️⃣ Axios

// Axios请求示例
axios.get('/api/users').then(response => {console.log('成功:', response.data);}).catch(error => {console.error('错误:', error);});// 使用async/await
async function getUsers() {try {const response = await axios.get('/api/users');console.log('成功:', response.data);} catch (error) {console.error('错误:', error);}
}

核心特点:

  • ✅ 基于Promise,支持async/await
  • ✅ 自动转换JSON数据
  • ✅ 强大的拦截器功能(请求和响应)
  • ✅ 客户端防止XSRF
  • ✅ 支持请求取消
  • ✅ 支持并发请求
  • ✅ 浏览器和Node.js环境都可使用
  • ❌ 需要额外引入第三方库

3️⃣ Fetch API

// Fetch API请求示例
fetch('/api/users').then(response => {if (!response.ok) {throw new Error('网络响应错误');}return response.json();}).then(data => {console.log('成功:', data);}).catch(error => {console.error('错误:', error);});// 使用async/await
async function getUsers() {try {const response = await fetch('/api/users');if (!response.ok) {throw new Error('网络响应错误');}const data = await response.json();console.log('成功:', data);} catch (error) {console.error('错误:', error);}
}

核心特点:

  • ✅ 浏览器原生支持,无需引入额外库
  • ✅ 基于Promise,支持async/await
  • ✅ 语法现代简洁
  • ✅ 支持请求流和响应流
  • ❌ 需手动处理错误状态码(只有网络错误才会reject)
  • ❌ 默认不带cookies(需配置credentials)
  • ❌ 不支持请求取消(需配合AbortController)
  • ❌ 不支持请求进度监控
  • ❌ 旧浏览器兼容性问题(IE完全不支持)

🔄 技术实现原理

Web请求实现原理
jQuery AJAX
基于XMLHttpRequest
Axios
浏览器: XMLHttpRequest
Node.js: http模块
Fetch API
基于现代网络请求API
XHR步骤
1. 创建XHR对象
2. 配置请求
3. 监听状态变化
4. 发送请求

jQuery AJAX原理

// 简化版jQuery AJAX原理实现
function ajax(options) {// 创建XHR对象const xhr = new XMLHttpRequest();// 配置请求xhr.open(options.method || 'GET', options.url, true);// 设置请求头if (options.headers) {Object.keys(options.headers).forEach(key => {xhr.setRequestHeader(key, options.headers[key]);});}// 监听状态变化xhr.onreadystatechange = function() {if (xhr.readyState === 4) {if (xhr.status >= 200 && xhr.status < 300) {let data = xhr.responseText;if (options.dataType === 'json') {try {data = JSON.parse(data);} catch (e) {options.error && options.error(xhr, 'parsererror', e);return;}}options.success && options.success(data);} else {options.error && options.error(xhr, xhr.statusText);}options.complete && options.complete(xhr, xhr.statusText);}};// 发送请求xhr.send(options.data || null);
}

Axios原理

// 简化版Axios原理实现
function axios(config) {return new Promise((resolve, reject) => {// 创建XHR对象const xhr = new XMLHttpRequest();// 应用请求拦截器config = applyRequestInterceptors(config);// 配置请求xhr.open(config.method || 'GET', config.url, true);// 设置请求头if (config.headers) {Object.keys(config.headers).forEach(key => {xhr.setRequestHeader(key, config.headers[key]);});}// 监听完成xhr.onload = function() {// 构建响应对象const response = {data: JSON.parse(xhr.responseText),status: xhr.status,statusText: xhr.statusText,headers: parseHeaders(xhr.getAllResponseHeaders()),config: config,request: xhr};// 应用响应拦截器applyResponseInterceptors(response).then(resolve).catch(reject);};// 监听错误xhr.onerror = function() {reject(new Error('Network Error'));};// 超时处理if (config.timeout) {xhr.timeout = config.timeout;}// 发送请求xhr.send(config.data || null);// 支持取消请求if (config.cancelToken) {config.cancelToken.promise.then(reason => {xhr.abort();reject(reason);});}});
}

Fetch API原理

// Fetch API是浏览器原生实现的,这是功能示例而非原理
function simplifiedFetch(url, options = {}) {return new Promise((resolve, reject) => {// Fetch API内部实现包含以下步骤:// 1. 创建和配置Request对象// 2. 执行网络请求// 3. 收到响应后创建Response对象// 4. 根据网络状态resolve或reject promise// 浏览器原生实现,不需要XMLHttpRequest// 使用更现代的网络API和流处理});
}

📊 三者功能对比表

功能/特性jQuery AJAXAxiosFetch API
基础实现XMLHttpRequestXMLHttpRequest现代网络API
Promise支持❌(旧)✅(新)
请求/响应拦截
自动JSON转换可配置需手动
取消请求有限支持需AbortController
超时设置❌(需自行实现)
浏览器兼容性⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
体积大小大(需jQuery)中等零(原生)
错误处理回调处理自动需手动检查status
并发请求$.whenaxios.allPromise.all
使用难度简单中等中等

🎯 实际项目选型指南

如何选择HTTP请求技术
是否需要支持旧浏览器?
考虑jQuery AJAX
是否需要丰富功能?
选择Axios
是否追求轻量级?
使用Fetch API
是否已使用jQuery?
是否为Node.js项目?

选型决策因素

  1. 项目类型与环境

    • 传统网站有IE兼容性需求 → jQuery AJAX
    • 现代SPA应用 → Axios或Fetch
    • 同时支持浏览器和Node.js → Axios
    • 轻量级项目或原型开发 → Fetch
  2. 技术栈考虑

    • 项目已使用jQuery → jQuery AJAX
    • React/Vue项目 → Axios(生态好)或Fetch
    • 无框架纯JS项目 → Fetch或简化版Axios
  3. 功能需求

    • 需要拦截器、请求转换等高级功能 → Axios
    • 只需基础请求功能 → Fetch
    • 需要丰富的事件处理 → jQuery AJAX或Axios
  4. 团队因素

    • 团队熟悉程度
    • 已有代码迁移成本
    • 长期维护考虑

💡 实际应用案例

企业级应用推荐选择

// 使用Axios创建定制HTTP客户端
import axios from 'axios';// 创建自定义实例
const apiClient = axios.create({baseURL: 'https://api.example.com',timeout: 10000,headers: {'Content-Type': 'application/json','X-Requested-With': 'XMLHttpRequest'}
});// 请求拦截器(添加认证信息)
apiClient.interceptors.request.use(config => {const token = localStorage.getItem('token');if (token) {config.headers.Authorization = `Bearer ${token}`;}return config;
}, error => {return Promise.reject(error);
});// 响应拦截器(处理常见错误)
apiClient.interceptors.response.use(response => {return response.data; // 直接返回数据部分
}, error => {if (error.response) {// 处理HTTP错误状态if (error.response.status === 401) {// 未授权,跳转登录router.push('/login');} else if (error.response.status === 403) {// 权限不足notification.error('没有权限执行此操作');}} else if (error.request) {// 请求发出但无响应notification.error('服务器无响应,请稍后再试');} else {// 请求配置错误notification.error('请求配置错误');}return Promise.reject(error);
});export default apiClient;

📚 总结

  • jQuery AJAX: 历史悠久,兼容性好,基于XHR实现,回调风格API,适合需要兼容旧浏览器和已使用jQuery的项目

  • Axios: 功能全面,基于Promise,支持拦截器和请求取消,适合中大型现代Web应用,同时支持浏览器和Node.js环境

  • Fetch API: 浏览器原生支持,语法现代,基于Promise,无需引入额外库,但功能较简单,需要额外处理错误状态码

实际选型建议:现代Web项目首选Axios,它在功能丰富性和易用性之间达到了良好平衡。如果追求轻量级且不需要复杂功能,可以考虑Fetch API。只有在需要支持旧浏览器或项目已深度依赖jQuery的情况下,才考虑jQuery AJAX。

相关文章:

  • Java实现加密(七)国密SM2算法的签名和验签(附商用密码检测相关国家标准/国密标准下载)
  • 基于ssm的音乐播放平台管理系统(源码+数据库)
  • Android开发,实现底部弹出菜单
  • 高等数学第二章---导数与微分(2.1~2.3)
  • 求职意向商务/BD简历模板
  • 通讯的基础概念:涵盖串行通信、并行通信、TCP、UDP、Socket 等关键概念和技术
  • [AI Workflow] 基于多语种知识库的 Dify Workflow 构建与优化实践
  • 统计术语学习
  • 零信任架构:重塑网络安全的IT新范式
  • AI与思维模型【76】——SWOT思维模型
  • PyTorch生成式人工智能实战(3)——分类任务详解
  • Unity3D Lua集成技术指南
  • 含锡废水处理的经济效益
  • Android APP 热修复原理
  • java.lang.ArrayIndexOutOfBoundsException: 11
  • 时间序列预测模型比较分析:SARIMAX、RNN、LSTM、Prophet 及 Transformer
  • 51单片机中断
  • Electron从入门到入门
  • Nacos简介—2.Nacos的原理简介
  • Linux:进程间通信->匿名管道实现内存池
  • 履新宿州市政府党组书记后,任东暗访五一假期安全生产工作
  • 燕子矶:物流网络中的闪亮节点|劳动者的书信②
  • 全球最大汽车板供应商宝钢股份:汽车工业加速转型中材料商如何共舞?
  • 《大风杀》上海首映,白客说拍这戏是从影以来的最大挑战
  • 微软上财季净利增长18%:云业务增速环比提高,业绩指引高于预期
  • 人民日报钟声:国际社会应共同维护科学溯源的正确方向