Axios源码解析(六):入口文件

158 阅读2分钟

上篇 Axios 源码解析(五):核心工具方法(2) 解析了 /cancel 目录下核心工具方法的代码。接下来终于接近尾声,本篇解析最后一片代码:入口文件 axios.js

github.com/MageeLin/ax… 中的 analysis 分支可以看到当前已解析完的文件。

axios.js

axios.js 的流程非常清晰:

  1. 写一个工厂函数
  2. 使用工厂函数生成实例
  3. 把各种相关的属性挂载到实例上
  4. 导出
// 导入工具对象
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流程图.jpg

总结

到此为止,其实全部的 axios 源码解析部分就已经全部完成了,希望让大家对 axios 的实现原理更深刻了一些。下面还预留一篇Axios 源码解析(七):项目周边,对 axios 项目相关周边 MD 进行了翻译,希望大家能按规范多提 PR,给开源社区多做贡献。