本文参加了每周一起学习200行源码共读活动

前言

axios 是 js 生态中常用的请求库。在使用的时候,我们会有很多疑惑,比如:

  • axios 外部函数的基础结构:
    • axios 为什么可以既作为对象去调用方法,又可以作为函数进行传参,axios 下的 Axios 又可以初始化一个实例?
    • axios 为什么可以通过调用一个 create 来生成一个实例进行请求,又可以直接使用 axios 进行请求?
  • 拦截器实现原理:
    • 设置多个拦截器时,如果将拦截器函数的结果传给下一个拦截器函数?
    • 请求和响应拦截器的执行顺序为什么不一样?
  • 请求取消实现原理:
    • axios 如何做到取消请求的?
  • 请求实现原理:
    • axios 如何做到既可以在浏览器中实现请求,也可以在 node 中实现请求?

这些问题在我们去扒 axios 的源码时,都可以得到解决。

在扒源码之前我们首先要找到 axios 的源代码,点此前往

之后就开始了愉快的扒代码。

基本结构

我们先来看一下 axios 的基本结构,在日后的扒代码中,更方便一些。

话不多说,先上图,上图之后都好说。

工程结构图

在图中,我们可以清晰的看到,我们所使用的整个 axios 其实本身是一个函数,只不过这个函数上挂载了很多方法,并且将核心类 Axios 的属性及方法也拷贝了上来。所以 axios 其实即是函数,也是对象。

而核心类 Axios 中是我们常用的一些方法,包括常用的 configrequestinterceptors 等属性或方法也都是在这里面。

从图中我们可以看出来,getputpost 等函数其实都是进行了 config 设置后的 request

interceptors 本质其实是一个 Object,它上面只有 requestresponse 两个属性,这两个属性其实都是 InterceptorManager 类的实例化。

其他方法也都是差不多。

而我们常用的 create 并不在图上。这是因为 create 其实是返回了 axios 的别名函数 createInstance 自身,并传入了历史已设置好的参数。相当于将整个 axios 进行了拷贝。