Axios 是什么?
Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中。
今天我们来进入 Axios 源码解析
Axios 功能
- 从浏览器中创建 XMLHttpRequests
- 从 node.js 创建 http 请求
- 支持 Promise API
- 拦截请求和响应
- 转换请求数据和响应数据
- 取消请求
- 自动转换 JSON 数据
- 客户端支持防御 XSRF
希望通过源码来慢慢理清这些功能的实现原理
Axios 使用
执行 GET
请求
1 | javascript复制代码axios.get('/user?ID=12345') |
执行 POST
请求
1 | javascript复制代码axios.post('/user', { |
使用方式不是本次主题的重点,具体使用方式可以参照 Axios 中文说明
源码拉下来直接进入 lib 文件夹开始解读源码
源码解读
lib/ axios.js 开始
1 | javascript复制代码'use strict'; |
lib/ util.js 工具方法
有如下方法:
1 | javascript复制代码module.exports = { |
is开头的isXxx方法名 都是判断是否是 Xxx
类型 ,这里就不做明说 主要是看下 后面几个方法
extend 将 b 里面的属性和方法继承给 a , 并且将 b 里面的方法的执行上个下文都绑定到 thisArg
1 | javascript复制代码// a, b,thisArg 参数都为一个对象 |
抽象的话看个例子
这样是不是就一目了然。fn2 函数没有拿自己对象内的 age = 20 而是被指定到了 thisArg 中的 age
自定义 forEach 方法遍历基本数据,数组,对象。
1 | javascript复制代码function forEach(obj, fn) { |
merge 合并对象的属性,相同属性后面的替换前的
1 | javascript复制代码function merge(/* obj1, obj2, obj3, ... */) { |
如下图所示:
bind -> lib/ helpers/ bind.js 这个很清楚,返回一个函数,并且传入的方法执行上下文绑定到 thisArg上。
1 | javascript复制代码module.exports = function bind(fn, thisArg) { |
好勒那么 axios/util 方法我们就基本没有问题拉
看完这些工具类方法后我们在回过头看之前的 createInstance 方法
1 | javascript复制代码function createInstance(defaultConfig) { |
总结:createInstance
函数返回了一个函数 instance.
- instance 是一个函数 Axios.prototype.request 且执行上下文绑定到 context。
- instance 里面还有 Axios.prototype 上面的所有方法,并且这些方法的执行上下文也绑定到 context。
- instance 里面还有 context 上的方法。
Axios 实例源码
1 | javascript复制代码'use strict'; |
上面的所有的方法都是通过调用了 this.request 方法
那么我们就来看这个 request 方法,个人认为是源码内的精华也是比较难理解的部分,使用到了 Promise 的链式调用,也使用到了中间件的思想。
1 | javascript复制代码function Axios(instanceConfig) { |
看到这里有点抽象,没关系。我们先讲下拦截器。在请求或响应被 then
或 catch
处理前拦截它们。使用方法参考 Axios 中文说明 ,大致使用如下。
1 | javascript复制代码// 添加请求拦截器 |
通过 promise 链式调用一个一个函数,这个函数就是 chain 数组里面的方法
1 | javascript复制代码// 初始的 chain 数组 dispatchRequest 是发送请求的方法 |
然后添加了请求拦截器和相应拦截器 chain 会是什么样子呢 (重点)
1 | ini复制代码chain = [ 请求拦截器的成功方法,请求拦截器的失败方法,dispatchRequest, undefined, 响应拦截器的成功方法,响应拦截器的失败方法 ]。 |
好了,知道具体使用使用之后是什么样子呢?回过头去看 request 方法
每次请求的时候我们有一个
1 | javascript复制代码 while (chain.length) { |
现在看是不是清楚了很多,拦截器的原理。现在我们再来看 InterceptorManager 的源码
InterceptorManager 拦截器源码
lib/ core/ InterceptorManager.js
1 | javascript复制代码'use strict'; |
dispatchRequest 源码
lib/ core/ dispatchRequest .js
1 | javascript复制代码'use strict'; |
看了这么多,我们还没看到是通过什么来发送请求的,现在我们看看在最开始实例化 createInstance 方法中我们传入的 defaults
是什么
var axios = createInstance(defaults);
lib/ defaults.js
1 | javascript复制代码'use strict'; |
总结
- Axios 的源码走读一遍确实可以看到和学习到很多的东西。
- Axios 还有一些功能:请求的取消,请求超时的处理。这里我没有全部说明。
- Axios 通过在请求中添加 toke 并验证方法,让客户端支持防御 XSRF Django CSRF 原理分析
最后
如果看的还不是很明白,不用担心,这基本上是我表达,书写的不够好。因为在写篇文章时我也曾反复的删除,重写,总觉得表达的不够清楚。为了加强理解和学习大家可以去 github 将代码拉下来对照着来看。这样在对 Axios 源码解析时会更加清晰
git clone https://github.com/axios/axios.git
全文章,如有错误或不严谨的地方,请务必给予指正,谢谢!
参考:
本文转载自: 掘金