从原生的XHR到jquery ajax,再到现在的axios和fetch,究竟发生了哪些变化,我们接下来就来探讨一下。
它是对原生XHR的封装,随着vue、react框架的兴起,很多情况下我们只需使用ajax可是却要引入整个jquery,这是非常不合理。
$.ajax({
type:'POST',
url:url,
data:data,
dataType:dataType,
success:function(){},
error:funciton(){}
})
优点:响应快,使用方便。
缺点:
fetch解决了使用ajax引入这个jquery文件的问题。fetch号称是ajax的替代品,它的API是基于Promise设计的。
//原生的XHR
var xhr=new XHRHttprequest();
xhr.open('GET',url);
xhr.onreadystatechange=funciton(){
if(xhr.readyState===4&&xhr.status===200){
console.log(xhr.responseText);
}
}
xhr.send()
//fetch
try {
let response = await fetch(url);//await后面是个promise对象
let data = await response.json();
console.log(data);
} catch(e) {
console.log("error:", e);
}
优势:
fetch('/testPost', {
method: 'post',
mode: 'no-cors',
data: {}
}).then(function() {});
缺点:
fetch(url,{credentials:'include'})
Vue2.0之后,Axios受到了更多人的关注。Axios本质是对原生XHR封装,需要一个promise对返回的结果进行处理。
function getUserAccount() {
return axios.get('/user/12345');
}
function getUserPermissions() {
return axios.get('/user/12345/permissions');
}
axios.all([getUserAccount(), getUserPermissions()])
.then(axios.spread(function (acct, perms) {
// Both requests are now complete
}));
axios({
methods:'post',
url:url,
data:data
}).then((resopnse)=>{
console.log(response)
}).catch((error)=>{
console.log(error)
})
底层还是对XHR
的封装,只不过需要一个Promise
对象对返回的结果进行处理。axios
在浏览器端是和Ajax底层的原理一样,都是通过XMLHttpRequest
对象进行的一次封装。
NPM包流程:
module.exports=axios;
axios又是什么?axios是向createInstance传了一个defaultConfig参数的返回值。//Axios/lib/axios.js
function createInstance(defaultConfig) {
var context = new Axios(defaultConfig);
...
return instance;
}
var axios = createInstance(defaults);
/ 通过nodejs中的process和浏览器的XMLHttpRequest来区别当前在前端还是nodejs中
function getDefaultAdapter() {
var adapter;
if (typeof process !== 'undefined' && Object.prototype.toString.call(process) === '[object process]') {
adapter = require('./adapters/http');//Nodejs端的Axios的实现:基于http或者https模块来发起请求的
} else if (typeof XMLHttpRequest !== 'undefined') {
adapter = require('./adapters/xhr');//浏览器中axios的实现:对ajax库的封装,只不过暴露一个Promise出去
}
return adapter;
}
var defaults = {
adapter: getDefaultAdapter(),
...
timeout: 0,
xsrfCookieName: 'XSRF-TOKEN',
xsrfHeaderName: 'X-XSRF-TOKEN',
maxContentLength: -1,
validateStatus: function validateStatus(status) {
return status >= 200 && status < 300;
}
};
defaults.headers = {
common: {
'Accept': 'application/json, text/plain, */*'
}
};
/ 进入core/InterceptorManager.js
InterceptorManager.prototype.use = function() {...}//使用拦截器
InterceptorManager.prototype.eject = function() {...}//删除use过的内容
InterceptorManager.prototype.forEach = function forEach(fn) {...}//循环执行fn
目前为止是createInstance函数执行返回的值就是axios的一些过程,给大家一个详细的连接,博主写的很好,我只是做些笔记。axios详细解读