欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 养生 > jQuery AJAX、Axios与Fetch

jQuery AJAX、Axios与Fetch

2025/4/26 7:13:36 来源:https://blog.csdn.net/m0_72030584/article/details/147501975  浏览:    关键词: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。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词