Axios

Axios是神马🐎?

axios一个基于 Promise 来管理 http 请求的简洁、易用且高效的代码封装库。通俗一点来讲,它是一个前端替代Ajax的一个东西,可以使用它发起http请求接口功能,它是基于Promise的,相比于Ajax的回调函数能够更好的管理异步操作。 源码地址

Axios 的主要特性

  • 基于 Promise
  • 支持浏览器和 node.js环境
  • 可添加请求、响应拦截器和转换请求和响应数据
  • 请求可以取消、中断
  • 自动转换 JSON 数据
  • 客户端支持防范 XSRF

源码目录结构及主要文件功能描述 基于版本0.21.4

├── /lib/ # 项目源码目

│ ├── /adapters/ # 定义发送请求的适配器

│ │ ├── http.js # node环境http对象

│ │ ├── xhr.js # 浏览器环境XML对象

│ ├── /cancel/ # 定义取消请求功能

│ ├── /helpers/ # 一些辅助方法

│ ├── /core/ # 一些核心功能

│ │ ├── Axios.js # axios实例构造函数

│ │ ├── createError.js # 抛出错误

│ │ ├── dispatchRequest.js # 用来调用http请求适配器方法发送请求

│ │ ├── InterceptorManager.js # 拦截器管理器

│ │ ├── mergeConfig.js # 合并参数

│ │ ├── settle.js # 根据http响应状态,改变Promise的状态

│ │ └── transformData.js # 转数据格式

│ ├── axios.js # 入口,创建构造函数

│ ├── defaults.js # 默认配置

│ └── utils.js # 公用工具函数

从入口出发

我们打开/lib/axios.js ,从入口开始分析。

var utils = require('./utils');
var bind = require('./helpers/bind');
var Axios = require('./core/Axios');
var mergeConfig = require('./core/mergeConfig');
var defaults = require('./defaults');

// 创建axios实例的方法
function createInstance(defaultConfig) {
  // 根据默认配置构建个上下文对象,包括默认配置和请求、响应拦截器对象
  var context = new Axios(defaultConfig);
  // 创建实例 bind后返回的是一个函数,并且上下文指向context
  var instance = bind(Axios.prototype.request, context);
  // 拷贝prototype到实例上 类似于把Axios的原型上的方法(例如: request、get、post...)继承到实例上,this指向为context
  utils.extend(instance, Axios.prototype, context);
  // 拷贝上下文对象属性(默认配置和请求、响应拦截器对象)到实例上, this指向为context
  utils.extend(instance, context);
  
  // 创建axios实例,一般axios封装 应该都会用到 (我们把一些默认、公共的配置都放到一个实例上,复用实例,无需每次都重新创建实例)
  instance.create = function create(instanceConfig) {
    // 这里mergeConfig 就是用来深度合并的
    return createInstance(mergeConfig(defaultConfig, instanceConfig));
  };

	// 返回实例
  return instance;
}

// 创建实例 defaulst为默认配置 
var axios = createInstance(defaults);

// 向外暴露Axios类,可用于继承 (本人暂未使用过)
axios.Axios = Axios;

// 这里抛出 中断/取消请求的相关方法到入口对象
axios.Cancel = require('./cancel/Cancel');
axios.CancelToken = require('./cancel/CancelToken');
axios.isCancel = require('./cancel/isCancel');

// 并发请求 完全就是用promise的能力
axios.all = function all(promises) {
  return Promise.all(promises);
};
// 和axios.all 共同使用,单个形参数组参数转为多参 =====> 后面有详解!!!
axios.spread = require('./helpers/spread');

// 用作监测是否为Axios抛出的错误
axios.isAxiosError = require('./helpers/isAxiosError');
// 导出
module.exports = axios;

// 允许在ts中使用默认导出
module.exports.default = axios;

createInstance

通过入口文件的分析我们可以发现:

  • 我们平常开发中直接使用axios.create()构建的实例和直接axios(),都是通过createInstance这个函数构造出来的。

这个函数大概做了如下几件事:

  1. 首先是根据默认配置构建个上下文对象,包括默认配置和请求、响应拦截器对象
  2. 创建实例 bind后返回的是一个函, 所以我们使用时可以axios(config)这么使用,并且上下文指向context
  3. 拷贝prototype到实例上 类似于把Axios的原型上的方法(例如: request、get、post...)继承到实例上,使用时才可以axios.get()、axios.post(),this指向为context
  4. 拷贝上下文对象属性(默认配置和请求、响应拦截器对象)到实例上, this指向为context
  5. 返回实例(实例为函数)

axios.create

针对axios.create 方法,正当整理写此篇解析文章期间,发现了 于2021年9月5号有了这么一条PR更新,也就是三天前,为什么这么做那:是为了大型应用、或多域使用多实例情况下, 可以针对已经构造的实例再次封装构造,提供深度构造控制器能力:详情见此条PR

  • axios的常使用的api 请求方法通过下面这行代码挂到的axios上的。

借此我们到/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

向画

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值