上篇 Axios 源码解析(五):核心工具方法(2) 解析了 /cancel
目录下核心工具方法的代码。接下来终于接近尾声,本篇解析最后一片代码:入口文件 axios.js
。
在github.com/MageeLin/ax… 中的 analysis
分支可以看到当前已解析完的文件。
axios.js
axios.js
的流程非常清晰:
- 写一个工厂函数
- 使用工厂函数生成实例
- 把各种相关的属性挂载到实例上
- 导出
// 导入工具对象
var utils = require('./utils');
var bind = require('./helpers/bind');
// 引入core模块下的Axios类
var Axios = require('./core/Axios');
// 合并配置的方法
var mergeConfig = require('./core/mergeConfig');
// 默认配置
var defaults = require('./defaults');
/**
* 创建一个Axios实例
*
* @param {Object} defaultConfig 实例的默认配置
* @return {Axios} 一个Axios的新实例
*/
function createInstance(defaultConfig) {
var context = new Axios(defaultConfig);
var instance = bind(Axios.prototype.request, context);
// 将 axios.prototype 复制到实例上
utils.extend(instance, Axios.prototype, context);
// 将 context 复制到实例上
utils.extend(instance, context);
return instance;
}
// 创建要导出的默认实例
var axios = createInstance(defaults);
// 将Axios类暴露在实例上,允许类继承
axios.Axios = Axios;
// 创建新实例的工厂方法
axios.create = function create(instanceConfig) {
return createInstance(mergeConfig(axios.defaults, instanceConfig));
};
// 将取消请求的相关方法暴露在实例上
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);
};
axios.spread = require('./helpers/spread');
// 将判断是否为Axios错误的 isAxiosError 方法暴露到实例上
axios.isAxiosError = require('./helpers/isAxiosError');
// 导出
module.exports = axios;
// 适配TypeScript中的import语法
module.exports.default = axios;
最终在结尾将 axios
实例进行了统一的导出,这也就是大家使用的时候最终引入的 axios
对象。
回顾
本篇内容较短,使用一张别人做的流程图针对之前的整个系列我们再做一遍回顾。
总结
到此为止,其实全部的 axios
源码解析部分就已经全部完成了,希望让大家对 axios 的实现原理更深刻了一些。下面还预留一篇Axios 源码解析(七):项目周边
,对 axios 项目相关周边 MD 进行了翻译,希望大家能按规范多提 PR,给开源社区多做贡献。