axios 的用法请参考: https://www.kancloud.cn/yunye…
明天剖析 axios 的入口文件 lib 下的 axios.js, 如下图:
文件结尾引入了一些辅助性的办法和对象:
utils: 次要是一些验证函数, 比方 isNumber isString isFunction isBuffer 这种,
bind: 一个闭包函数
module.exports = function bind(fn, thisArg) {return function wrap() {var args = new Array(arguments.length);
for (var i = 0; i < args.length; i++) {args[i] = arguments[i];
}
return fn.apply(thisArg, args); // fn 的作用域中能够拿到 thisArg 中的属性和办法
};
};
Axios: axios 的构造函数. 就是说咱们用的 axios({}) 是 Axios 的一个实例
mergeConfig: 一个函数, 用来合并配置, 就是将咱们传入的配置和默认配置合并
defaults: 默认对象.
文件内有一个创立实例的办法, 以往的构造函数是间接用 new 关键字创立实例,axios 应用这个:
/**
* 创立 axios 实例
*
* @param {Object} defaultConfig 实例的默认配置
* @return {Axios} 返回一个新的实例
*/
function createInstance(defaultConfig) {var context = new Axios(defaultConfig); // axios 的构造函数的实例
// console.log('context',typeof context);
var instance = bind(Axios.prototype.request, context); // 一个闭包, 返回一个函数 第一个参数是办法, 第二个是失常参数, 调用 instance 时参数将传给 Axios.prototype.request, 将 this 指向 context
// 也就是 axios({}), 咱们传的对象传给了 request
// 将 Axios.prototype 的属性和属性值变成 instance 的属性和属性值 并返回 instance
utils.extend(instance, Axios.prototype, context);
// 将 context 复制给实例
utils.extend(instance, context); // 将 context 的属性赋给 instance, 再将值通过 bind 给了 instance
return instance; // 是一个函数 axios({}) 就是 instance({})
}
// 创立默认的实例
var axios = createInstance(defaults); // defaults 一个大的对象. 各种配置
而后给实例 axios 增加属性:
// 公开 Axios 类并容许类继承 axios 曾经是一个实例, 又增加了一个 Axios 属性, 值是一个构造函数
axios.Axios = Axios;
// 增加一个工厂用来创立新的实例
axios.create = function create(instanceConfig) {return createInstance(mergeConfig(axios.defaults, instanceConfig)); // createInstance 办法的返回值
};
// 公开 Cancel & CancelToken
axios.Cancel = require('./cancel/Cancel');
axios.CancelToken = require('./cancel/CancelToken');
axios.isCancel = require('./cancel/isCancel');
// 公开 all/spread
axios.all = function all(promises) {return Promise.all(promises); // Promise.all() 办法用于将多个 Promise 实例,包装成一个新的 Promise 实例};
axios.spread = require('./helpers/spread');
// 公开 isAxiosError
axios.isAxiosError = require('./helpers/isAxiosError');
module.exports = axios;
// 容许应用模块化的 default 语法
module.exports.default = axios;