本文中axios版本为0.19.2,内容为自己学习总结,如有错误敬请指出,感谢
介绍
Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中。无论是vue还是react都推荐使用其作为项目里的请求库。本文中axios版本为0.19.2
官方github仓库中列出了如下功能:
- 从浏览器中创建 XMLHttpRequests
- 从 node.js 创建 http 请求
- 支持 Promise API
- 拦截请求和响应
- 转换请求数据和响应数据
- 取消请求
- 自动转换 JSON 数据
- 客户端支持防御 XSRF
我们就来看看,axios是如何一步一步实现的。
最简单的一个XMLHttpRequest封装
先来看一个简单的封装ajax代码

- 创建一个
XMLHttpRequest对象 - 处理url, data, type等配置
- 设置headers, 发送请求(open, send)
- 回调监听,通过xhr对象的
onreadystatechange属性
关于什么是XMLHttpRequest对象可以看MDN上的文档,文末有附链接。
在Axios源码中,实际同样也是这四个步骤,如
- 在1步骤中,使用
Promise包裹XMLHttpRequest对象 - 在2步骤中,增加序列化,baseURL,withCredential等自定义配置
- 在3步骤中,增加XSRF携带token,auth用户身份校验等
- 在4步骤中,增加超时timeout,请求与响应的拦截,数据的转换等功能
这样看来,axios实际并不复杂
目录结构
我们前往axios将源码下载下来,先看看目录结构,如图

-lib
-adapters --- 请求对象
- http.js --- node环境,request对象
- xhr.js --- 浏览器环境,创建XMLHttpRequest对象
-cancel --- 取消类
- Cancel.js --- Cancel对象,含message属性
- CancelToken.js --- CancelToken对象,取消request请求
- isCancel.js --- 工具函数,判断是否取消过
-core --- 核心
-Axios.js --- Axios类
-buildFullPath.js --- 拼接请求URL
-createError.js --- 创建enhanceError对象
-dispatchRequest.js --- 发送请求
-enhanceError.js --- enhanceError对象类
-interceptorManager.js --- 拦截器对象
-mergeConfig.js --- 合并配置工具函数
-settle.js --- status监听判断
-transformData.js --- data数据转换
-helpers --- 工具函数
-bind.js --- 绑定上下文
-buildURL.js --- 处理get请求url参数
-combineURLs.js --- 组合baseURL与config.url
-cookies.js --- 读写cookies信息
-deprecatedMethod.js --- 不知道干啥的
-isAbsoluteURL.js --- 判断是否完整请求地址
-isURLSameOrigin.js --- 是否同域
-normalizeHeaderName.js --- 规范headers名称格式
-parseHeaders.js
-spread.js
- axios.js --- 输出Axios
- defaults.js --- 默认配置
- utils.js --- 基础工具函数
一眼看过去像是很多模块,不过细看发现一个js文件内功能单一,代码量并不大。
入口与输出
我们看最外层的index.js,就只有一行内容


引用一个Axios类,调用createInstance方法并传入defaults配置将其实例化并输出
我们在项目中使用到的axios API都源自这个实例
最后
因内容较多,在后续笔记中,我们再继续深入了解这个实例包含的属性与方法的具体实现,感谢。