
这篇文章就帮你把两者的核心区别掰碎了讲:从底层原理、写法复杂度,到错误处理(axios自动拦截 vs ajax手动判断状态码)、浏览器兼容(axios默认支持现代浏览器,ajax要兼容旧版得加补丁),甚至连前端日常最常遇到的场景——比如Vue/React项目里选谁更顺手、跨域请求怎么配置更省心、异步数据获取谁效率更高,都给你明明白白列出来。
看完这篇,你再也不用对着“axios还是ajax”的问题挠头,选工具时心里特有底!
你是不是也有过这种情况?写前端请求的时候,同事说“用axios吧”,你问“那ajax呢?”,结果对方说“这俩不一样啊”,可到底哪里不一样,你盯着代码想半天也没理清——其实我刚入行时也犯过这错,以为axios是“新的ajax”,直到带我的师傅拍着我肩膀说:“傻孩子,ajax是地基,axios是盖在地基上的房子。”今天我用做了5年前端的经验,把这俩的区别掰碎了讲,保证你看完再也不混。
先搞懂:axios和ajax到底是什么关系?
很多人第一个误区就是“把axios当新的ajax”——其实ajax不是库,是一套“异步发请求”的技术方案,核心是浏览器的XMLHttpRequest
(XHR)API。简单说,就是“不用刷新页面,悄悄给后端发消息、拿数据”的技术。比如你在淘宝点“加载更多”,商品列表往下翻不用刷新页面,就是ajax在干活。
而axios呢?是封装了ajax的JavaScript库——就像把原生ajax的“做饭步骤”(发请求、等回复、处理错误)做成了“预制菜”,你不用再自己买菜、切菜、炒菜,直接加热就能吃。我之前带过一个实习生小王,他第一次写请求时,直接用axios.get()
,以为这是“新的ajax语法”,直到我让他写一段原生ajax代码,他才发现:原来axios帮他做了这么多脏活累活。
举个大白话例子:原生ajax就像你给朋友发微信,得自己点“发送”、等“对方正在输入”、看“消息有没有红感叹号”;而axios就像你用“语音转文字”发消息——你说句话,系统自动帮你转文字、发消息、提示“对方已读”,还能自动把“对方没回”标成未读。
再讲个专业点的:原生ajax得手动操作XMLHttpRequest
,比如这样:
var xhr = new XMLHttpRequest();
xhr.open('GET', '/api/user', true); // 配置请求
xhr.onreadystatechange = function() { // 监听状态变化
if (xhr.readyState === 4) { // 请求完成
if (xhr.status === 200) { // 状态码OK
var data = JSON.parse(xhr.responseText); // 解析数据
console.log(data);
} else {
console.log('请求错了:' + xhr.status); // 处理错误
}
}
};
xhr.send(); // 发请求
你看,光发一个GET请求,就得写这么多代码,还得自己管“请求状态”“状态码”“数据解析”——我之前做一个新闻列表页,用原生ajax写了120行代码,后来换成axios,只用了30行,bug还少了一半。
核心区别:从用法到场景,一篇表理清
说了这么多,到底两者有啥核心区别?我整理了一张对比表,从底层实现到日常场景,一眼看明白:
对比维度 | ajax(原生) | axios |
---|---|---|
底层实现 | 完全依赖浏览器的XMLHttpRequest API | 浏览器端封装XMLHttpRequest,Node.js端用http模块(跨端支持) |
语法风格 | 回调函数(易形成“回调地狱”) | Promise链式调用/async/await(语法更简洁) |
错误处理 | 需手动判断status(如404/500),易漏判 | 自动捕获HTTP错误(进catch),支持拦截器统一处理 |
浏览器兼容 | 需手动处理IE7+兼容(如ActiveXObject) | 默认支持现代浏览器,无需额外兼容代码 |
生态支持 | 无官方生态,需自己封装工具函数 | 支持Vue/React生态(如vue-axios),Node.js端可用 |
原生ajax最让人头疼的就是回调地狱——比如你要先拿用户信息,再拿订单列表,再拿商品详情,得嵌套三层onreadystatechange
,代码像“金字塔”一样越写越乱。我之前做一个电商订单页,用原生ajax写了5层回调,后来改bug时,盯着代码看了半小时才理清逻辑。
而axios用Promise解决了这个问题——你可以用.then()
链式调用,或者更简洁的async/await
。比如同样的订单页需求,用axios写是这样的:
async function getOrderData() {
try {
const user = await axios.get('/api/user'); // 先拿用户
const orders = await axios.get(/api/orders?uid=${user.data.id}
); // 再拿订单
const products = await axios.get(/api/products?oid=${orders.data[0].id}
); // 再拿商品
console.log(products.data);
} catch (err) {
console.log('出错了:' + err.message); // 统一处理错误
}
}
你看,代码是“线性”的,跟说话一样自然,再也不用嵌套回调了——我第一次用async/await
写axios时,感觉像“解脱了”,原来写请求可以这么爽。
原生ajax的错误处理得自己盯紧每一步——比如你发请求后,得判断xhr.readyState
是不是4(请求完成),再判断xhr.status
是不是200(成功),如果是404(找不到资源)或500(服务器错误),还得单独写逻辑。我之前做一个登录功能,用原生ajax,没处理401错误(未授权),结果用户输入错误密码后,页面没反应,查了半天才发现:xhr.status
是401,但我没写判断,所以没进入错误处理。
而axios的错误处理是“智能”的——只要HTTP状态码不是2xx(比如4xx、5xx),都会自动触发catch
。你还能加拦截器,统一处理所有请求错误,比如:
// 请求拦截器:加token
axios.interceptors.request.use(config => {
config.headers.Authorization = 'Bearer ' + localStorage.getItem('token');
return config;
});
// 响应拦截器:统一处理错误
axios.interceptors.response.use(res => res, err => {
if (err.response.status === 401) {
alert('登录过期,请重新登录');
location.href = '/login'; // 跳登录页
}
return Promise.reject(err);
});
我现在做项目,都会加这两个拦截器——之前有个项目,用户token过期后,页面直接跳登录页,用户反馈“比之前的提示框贴心多了”。
其实选工具的核心是“匹配项目需求”——
vue-axios
插件全局挂载axios,组件里直接this.$axios.get()
,省了很多重复import
的代码;再比如写Node.js后端,调用微信API,用axios发请求,不用换工具,学习成本低。 其实 axios和ajax不是“对手”,是“进化”——就像你以前用按键手机,现在用智能手机,核心都是“打电话”,但智能手机更方便。你之前有没有搞混过这俩?或者用的时候遇到过什么坑?欢迎留言告诉我,我帮你分析分析!
本文常见问题(FAQ)
axios和ajax到底是什么关系啊?
很多人一开始都误以为axios是“新的ajax”,其实压根不是——ajax是一套“不用刷新页面发请求”的技术方案,核心是浏览器的XMLHttpRequest API,比如淘宝“加载更多”不用刷新页面,就是ajax在干活;而axios是封装了ajax的JS库,相当于把原生ajax的“麻烦步骤”(发请求、等回复、处理错误)做成了“预制菜”,你不用自己一步步写,直接用更简单的语法就能发请求。打个比方,ajax是地基,axios是盖在地基上的房子,没有地基就没有房子,但住房子肯定比住地基舒服。
axios比原生ajax好用在哪儿?
最直观的是语法更顺——原生ajax得写一堆回调函数,嵌套多了像“金字塔”,容易乱;axios用Promise或者async/await,代码是线性的,跟说话一样自然。然后是错误处理更省心,原生ajax得自己盯着status码(比如404、500),漏判就会出bug;axios只要状态码不是2xx,自动进catch,还能加拦截器统一处理,比如token过期直接跳登录页。还有兼容问题,axios默认支持现代浏览器,不用额外写IE兼容代码,原生ajax要兼容IE7+得加ActiveXObject的判断,麻烦得很。
什么时候该用原生ajax,什么时候用axios?
得看项目情况——如果是很小的静态页(比如公司官网的联系表单),或者不想引任何库(追求“轻量”),用原生ajax就行,毕竟就一个请求,没必要引axios;但如果是Vue/React这类框架项目,或者需要跨端(浏览器+Node.js),优先选axios,比如Vue项目可以用vue-axios插件全局挂载,组件里直接用this.$axios,省很多事;Node.js端调用第三方API(比如微信接口),axios也能直接用,不用换工具。
axios的拦截器到底有啥用啊?
拦截器就是“在请求发出去前”或者“收到响应后”,统一做点儿事。比如请求拦截器,你可以给所有请求加token,不用每个请求都写一遍header;响应拦截器更实用,比如统一处理错误——要是收到401(登录过期),直接弹出提示框跳登录页,不用每个请求都单独判断。我现在做项目必加这俩拦截器,之前有个项目用户token过期后,页面自动跳登录,用户反馈比之前“没反应”贴心多了。
用axios需要担心浏览器兼容吗?
不用太担心!axios默认支持Chrome、Firefox、Edge这些现代浏览器,不用额外写兼容代码;但原生ajax就不一样了,要是得兼容IE7及以下,还得写ActiveXObject的判断(比如var xhr = window.XMLHttpRequest ? new XMLHttpRequest() new ActiveXObject(‘Microsoft.XMLHTTP’)),麻烦得很。现在大部分项目都不用兼容这么老的浏览器了,所以用axios更省心。