你不知道的秘密-axios源码

axios源码阅读笔记

在没有阅读axios源码之前我对它的理解一直是一个基于promise封装的ajax请求工具。当我通读了一遍axios源码之后,带给我很多认知上的变化,发现这个库有很多设计思想在里面。让我们带着下面这些疑问来看一下源码中是如何做的。

md 复制代码
1、axios为什么可以做为方法直接调用,又可以做为对象使用? 如axios(config).then() 和 axios.create(config)
2、axios既可以在浏览器中使用又可以在服务端使用?
3、axios中的拦截器(请求和响应)是如何工作的?
4、axios中使用了哪些设计理念?

调试源码准备工作

当我们在阅读源码时一般需要边执行边看代码,这样可以快速理解代码的运行过程。因此我们需要在开发工具中配置调试工具。

第一步下载源码
bash 复制代码
git clone https://github.com/axios/axios.git
第二步看文件的目录

找到README.md 和 CONTRIBUTING.md这两个文件,一般这上面会有说使用方法和开发指南。我们可以很容易看到下面的代码。

bash 复制代码
- `npm run test` run the jasmine and mocha tests
- `npm run build` run rollup and bundle the source
- `npm run version` prepare the code for release

```bash
> npm run examples
# Open 127.0.0.1:3000
```

Running sandbox in browser

```bash
> npm start
# Open 127.0.0.1:3000
```

我们下载依赖包,然后构建项目,最后使用启动命令可以在本地跑起来一个服务,默认配置的服务端口是3000。具体的package.json文件中有命令运行配置,想更详细的了解的看一下相关命令。

基于这个服务我们可以在浏览器打开,借助chorme进行调试相关的代码了。但这种方式调试不是最直接的源码,还是不太直观。

第三步在vscode中添加相应调试方法

下面我们在vscode中添加相应的调试方法。

🔗url 要改成你启动服务的端口号,webRoot 是用来解析 sourcemap

启动npm run start 本地启动一个服务端口,然后点击调试运行工具(三角形),这样就会打开一个chrome(这里我配置的是chrome,也可以改成其他的浏览器)浏览器就可以调试了。

axios源码解析

先来看一下axios目录的结构

axios的初始化过程

我们在入口文件处 axios = createInstance(defaults) 加上断点,可以了解整个axios的初始化过程。

初始化流程核心如上图,从这段源码就可以明白为什么axios即可以做方法也可以作为对象使用了,返回的axios是一个wrap函数,在wrap函数上我们挂在了很多Axios原型方法、create方法以及属性,源码中还在axios中挂载了其他的配置,详细可以看源码。

下面断点调试看一下流程

这里可以看到extend方法就是将传入的Axios.prototype中的方法通过bind重新指定指向绑定到axios实例上。

将所有的配置挂载到axios,并暴露出来。

axios在浏览器中调用流程

这里使用项目中提供的demo进行测试。

上面我们可以看到使用拦截器,会将我们提供的成功和失败回调放入到handlers中。后面在实际请求的时候回用到。进入到axios请求中,可以看到再次进入到bind方法了。

我们再次进入方法内部会看到调用request方法

这里插入一个说明,我们使用的post、get等方法也是在这个核心类中定义的,本质都是调用request方法。

这里进行了默认配置和我们传入的配置进行了合并操场

接下来处理了前面我们设置的拦截器相关的回调方法。请求拦截器将回调方法向队头插入,响应拦截器将回调方法向队尾插入

不是异步的请求头拦截器就在这里被调用执行,可以看到promise.then()中每次取出两个方法刚好对应前面设置的成功回调和失败回调。

再来看下面这段代码,可以看到取消请求配置,请求参数处理。我们停留的位置看到适配器了,这里的处理就是我们为什么可以在浏览器、node端都可以使用的原因,adapter配置了【'xhr','fetch','http'】,可以根据我们不同的环境调用不同的请求封装。

默认是用ajax的方式进行请求的,我们进入方法内容看一下具体实现。

成功之后回再次回到这里,执行响应拦截器相关回调方法。

到这里差不多就处理完了请求到响应相关的流程了。

总结

axios在架构设计上拆分了不同的功能模块,通过不同的属性、方法来乔接不同的功能。在源码中我们看到了不少的设计在里面,如取消请求中使用了发布订阅的模式、兼容不同平台使用适配器的模式、创建实例使用工厂模式、以及函数式编程的方式,参数的归一化处理等。这次的源码阅读还是很有收获,下一步计划看一下lodash源码。

相关推荐
让辣条自由翱翔几秒前
总结一下Vue的组件通信
前端
dyb1 分钟前
开箱即用的Next.js SSR企业级开发模板
前端·react.js·next.js
前端的日常2 分钟前
Vite 如何处理静态资源?
前端
前端的日常3 分钟前
如何在 Vite 中配置路由?
前端
兮漫天3 分钟前
bun + vite7 的结合,孕育的 Robot Admin 靓仔出道(一)
前端
PineappleCoder4 分钟前
JS 作用域链拆解:变量查找的 “俄罗斯套娃” 规则
前端·javascript·面试
兮漫天4 分钟前
bun + vite7 的结合,孕育的 Robot Admin 靓仔出道(二)
前端
用户47949283569159 分钟前
面试官:为什么很多格式化工具都会在行尾额外空出一行
前端
知识分享小能手10 分钟前
Vue3 学习教程,从入门到精通,Vue3 中使用 Axios 进行 Ajax 请求的语法知识点与案例代码(23)
前端·javascript·vue.js·学习·ajax·vue·vue3
一大树10 分钟前
首屏白屏的处理方案~嗖得一下
前端