(Ajax)axios源码简析(一)——axios入口文件

news/2024/5/17 1:35:59

传送门:

  • axios源码简析(一)——axios入口文件
  • axios源码简析(二)——Axios类与拦截器
  • axios源码简析(三)——请求与取消请求

axios简介

axios是时下最流行的http请求库,可以用于浏览器环境与nodejs环境。目前axios的最近版本是0.18.0,本文所分析的源码也是该版本。

axios的主要特征包括:

  • 在浏览器环境创建xhr请求
  • 在nodejs环境创建http请求
  • 支持PromiseAPI
  • 请求与响应拦截器
  • 处理请求参数与返回数据
  • 取消请求
  • 自动转换JSON数据
  • 客户端支持防范XSRF

axios基本用法

axios.get('/user?ID=12345')
  .then(function (response) {
    // handle success
    console.log(response);
  })
  .catch(function (error) {
    // handle error
    console.log(error);
  })  .then(function () {
    // always executed
  });

axios的具体使用方法见GitHub。

项目结构目录

├── /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 defaults = require('./defaults');

/* ... */

var axios = createInstance(defaults);

/* ... */

module.exports = axios;

在入口文件中,可以看到通过createInstance方法创建了axios对象,然后将其导出,其中defaults是默认的配置。

createInstance方法的具体实现:

function createInstance(defaultConfig) {

    // 创建一个Axios类的实例,得到一个上下文环境
    // 包含defaults配置与拦截器(详见/lib/core/Axios.js)
    var context = new Axios(defaultConfig);

    // instance是一个函数(request请求方法)
    // this绑定到context上下文
    var instance = bind(Axios.prototype.request, context);

    // 将Axios.prototype的各方法绑定到instance上
    // 其中this作用域为context上下文
    utils.extend(instance, Axios.prototype, context);

    // 将context中的属性(defaults与拦截器)绑定到instance实例中
    utils.extend(instance, context);

    return instance;
}

值得注意的是,入口文件导出的axios并不是Axios类的实例,而是bind(Axios.prototype.request, context)返回的一个函数,其中context才是Axios类的实例。

入口文件的其他代码如下:

// 将Axios类暴露出来(如果用户有使用的需求)
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');

// 处理并行请求的方法
axios.all = function all(promises) {
    return Promise.all(promises);
};
axios.spread = require('./helpers/spread');

// 导出axios
module.exports = axios;

// 用于TypeScript
module.exports.default = axios;

参考

深入浅出 axios 源码


http://www.niftyadmin.cn/n/2132485.html

相关文章

基于引力搜索机制的花朵授粉算法

文章目录一、理论基础1、花朵授粉算法2、基于引力搜索策略的花朵授粉算法2.1 引力搜索算法2.2 引力机制的FPA2.3 算法的实现二、仿真实验与结果分析三、参考文献一、理论基础 1、花朵授粉算法 请参考这里。 2、基于引力搜索策略的花朵授粉算法 2.1 引力搜索算法 请参考这里…

融合振幅随机补偿与步长演变机制的改进原子搜索优化算法

文章目录一、理论基础1、原子搜索优化算法(ASO)2、改进的原子搜索优化算法(IASO)(1)初始原子种群的混沌优化(2)振幅函数随机参数优化(3)步长演变搜索机制(4)IASO算法的实现二、仿真实…

JAVA中String.format的用法 格式化字符串,格式化数字,日期时间格式化,

1.对整数进行格式化:%[index$][标识][最小宽度]转换方式 我们可以看到,格式化字符串由4部分组成,其中%[index$]的含义我们上面已经讲过,[最小宽度]的含义也很好理解,就是最终该整数转化的字符串最少包含多少位数…

采用混合搜索策略的阿奎拉优化算法

文章目录一、理论基础1、AO算法2、HAO算法(1)动态调整(2)混沌自适应权重(3)改进型差分变异策略(4)HAO算法流程二、仿真实验与结果分析三、参考文献一、理论基础 1、AO算法 请参考这…

说一说MVC的MenuCard(五)

1.数据库设计 1 2 create database BookShop3 go4 5 use bookshop6 go7 8 --模块表9 create table Module 10 ( 11 ModuleID int not null primary key identity(1,1), 12 ModuleName varchar(50) not null unique, 13 ModuleIcon varchar(20) not null defa…

基于战争策略优化算法的函数寻优算法

文章目录一、理论基础1、战争策略优化算法(1)攻击策略(2)排名(军衔)和权重更新(3)防御策略(4)弱势士兵的替换/重新安置2、WSO算法伪代码二、仿真实验与结果分析三、参考文献一、理论…

HTTP 缓存验证

缓存验证 坑:缓存验证的时机 在用户点击刷新按钮时浏览器会进行缓存验证被缓存的response头部包含"Cache-Control:must-revalidate"ETags 作为缓存的一种强校验器,ETag 响应头是一个对用户代理(User Agent, 下面简称UA)不透明(译者…

基于非线性参数的海洋捕食者算法

文章目录一、理论基础1、海洋捕食者算法(MPA)2、非线性海洋捕食者算法(NMPA)二、仿真实验与结果分析三、参考文献一、理论基础 1、海洋捕食者算法(MPA) 请参考这里。 2、非线性海洋捕食者算法(NMPA) MPA算法根据各种研究的规则和要点以及自然界的实际行为模拟捕食者和猎物的…