目录
📁 lib
|—— 📁 adapters // axios主要使用的请求方法
|—— |—— 📃 http.js // axios中node端使用的请求函数
|—— |—— 📃 xhr.js // axios中浏览器端使用的请求函数
|—— 📁 cancel
|—— |—— 📃 Cancel.js // 定义了,取消请求返回的信息结构
|—— |—— 📃 CancelToken.js // 定义了用于取消请求的主要方法
|—— |—— 📃 isCancel.js // 判断是否是取消请求的信息
|—— 📁 core
|—— |—— 📃 Axios.js // Axios类
|—— |—— 📃 AxiosError.js // Axios自己封装的一个抛出错误的类
|—— |—— 📃 buildFullPath.js // 通过结合baseURL和requestdurl创建一个新的URL,
|—— |—— 📃 dispatchRequest.js // 发起请求的地方
|—— |—— 📃 InterceptorManager.js // InterceptorManager类,拦截器类
|—— |—— 📃 mergeConfig.js // 合并配置项
|—— |—— 📃 settle.js // 根据请求状态,处理Promise
|—— |—— 📃 transformData.js // 使用default.js中transformRequest和transformResponse对响应以及请求进行格式化
|—— 📁 defaults
|—— |—— 📃 index.js // 定义axios请求默认的配置
|—— |—— 📃 transitional.js // 过渡性的参数
|—— 📁 env
|—— 📁 helpers
|—— |—— 📃 AxiosURLSearchParams.js // 处理传入参数 params 转换为 formData
|—— |—— 📃 bind.js // 工具函数
|—— |—— 📃 buildURL.js // 将params参数
|—— |—— 📃 combineURLs.js // 组合baseurl
|—— |—— 📃 cookies.js // 封装了读取,写入,删除cookies的方法
|—— |—— 📃 deprecatedMethod.js // 向开发者提供他们正在使用的方法已被弃用的警告
|—— |—— 📃 formDataToJSON.js // 将FormData转成JSON的格式
|—— |—— 📃 fromDataURI.js // 解析uri成Buffer或Blob
|—— |—— 📃 isAbsoluteURL.js // 判断是否为绝对路径(指的://或//开头的为绝对路径)
|—— |—— 📃 isAxiosError.js // 判断一个 Error 对象是否为 Axios 抛出,所有由 Axios 抛出的错误都有一个 isAxiosError 标识。
|—— |—— 📃 isURLSameOrigin.js // 检测当前的url与请求的url是否同源
|—— |—— 📃 normalizeHeaderName.js // 对对象属性名的进行格式化,删除,新建符合大小写规范的属性
|—— |—— 📃 null.js // 抛出null
|—— |—— 📃 parseHeaders.js // 将getAllResponseHeaders返回的header信息转化为对象
|—— |—— 📃 spread.js // 将数组形式的参数按次序给回调函数传参并且调用。
|—— |—— 📃 toFormData.js // 将数据对象转换为FormData
|—— |—— 📃 toURLEncodedForm.js // 将数据对象转换为 URLSearchParams
|—— |—— 📃 validator.js // 返回了 assertOptions:断言对象上的各个属性类型; validators:各种 JS 类型的校验器
|—— 📃 axios.js
|—— 📃 utils.js // 一些工具方法
|—— |—— ⏹ isArray // 确定一个值是否为数组
|—— |—— ⏹ isArrayBuffer // 确定一个值是否为ArrayBuffer
|—— |—— ⏹ isBuffer // 判断value是否为Buffer
|—— |—— ⏹ isFormData // 判断是否是formData对象
|—— |—— ⏹ isArrayBufferView // 判断一个值是否是ArrayBuffer视图
|—— |—— ⏹ isString // 判断value是否为String
|—— |—— ⏹ isNumber // 判断value是否为Number
|—— |—— ⏹ isObject // 判断value是否为Object
|—— |—— ⏹ isPlainObject // 判断value是否为纯 Object
|—— |—— ⏹ isUndefined // 判断是否为undefined
|—— |—— ⏹ isDate // 判断value是否为 Date
|—— |—— ⏹ isFile // 判断value是否为 File
|—— |—— ⏹ isBlob // 判断value是否为 Blob
|—— |—— ⏹ isFunction // 判断value是否为 Function
|—— |—— ⏹ isStream // 判断value是否为 Stream
|—— |—— ⏹ isURLSearchParams // 判断是否为URLSearchParams对象
|—— |—— ⏹ isStandardBrowserEnv// 判断当前环境是否为标准浏览器环境
|—— |—— ⏹ forEach // 迭代数组或对象,对每一子项都执行一个回调函数
|—— |—— ⏹ merge // 把所有的参数的属性合并,返回合并后的新对象
|—— |—— ⏹ extend // 把 b 对象上的属性挨个覆盖在了 a 对象上
|—— |—— ⏹ trim // 修剪字符串前后的空白
|—— |—— ⏹ stripBOM // 删除Byte Order Mark。捕获 EF BB BF(UTF-8 BOM)
|—— |—— ⏹ inherits // 从一个构造函数继承原型方法到另一个构造函数
|—— |—— ⏹ toFlatObject // 将具有深度原型链的对象解析为平面对象
|—— |—— ⏹ kindOf // 用于判断一个值的类型
|—— |—— ⏹ kindOfTest // 判断当前数据类型是否与期望的类型一致
|—— |—— ⏹ endsWith // 判断字符串是否以指定字符串的字符结束
|—— |—— ⏹ toArray // 根据数组类对象返回新数组,失败则返回null
|—— |—— ⏹ isTypedArray // 判断value是否为 TypedArray
|—— |—— ⏹ isFileList // 判断value是否为 FileList
|—— |—— ⏹ forEachEntry //
|—— |—— ⏹ matchAll // 根据正则来匹配字符串所有符合的格式
|—— |—— ⏹ isHTMLForm // 判断value是否为 HTMLFormElement
|—— |—— ⏹ hasOwnProperty // 判断对象自身属性中是否具有指定的属性
cancel
取消请求
// 引用CancelToken
const CancelToken = axios.CancelToken;
// 调用CancelToken.source得到一个source实例,此实例包含token和cancel两个属性
const source = CancelToken.source();
// 通过source.cancel取消请求
source.cancel('Operation canceled by the user.');
CanceledError.js
CanceledError 是一个在操作被取消时抛出的对象。
1. 绑定了在操作被取消的时候需要处理
2. 将 AxiosError 继承到 CanceledError 的原型上
3. module.exports = CanceledError;
CancelToken.js
CancelToken 是一个可用于请求取消操作的对象
1. 执行CancelToken.source(), 返回一个包含cancel与token两个属性的对象
2. 首先此方法创建了一个calcel变量,紧接着,又创建了一个token,而token的赋值结果是调用构造函数CancelToken得到, cancel是从executor函数的参数赋值得到的
3. 对于构造函数CancelToken,它接受一个参数executor。
4. 接着,函数内声明了一个名为resolvePromise的变量。
5. 然后就是构造器属性this.promise,既然是构造器属性,那么这里可以预先知道,source方法中得到的token上一定有这个promise属性(上面截图已经展示了token中有个Promise),而这个属性又由一个Promise构造器创建。
6. 定义了构造器的then方法
1. 新建一个promise来, 定义resolve方法, 将此取消的信号给存在 _listeners 内
2. 定义cancel方法, 调用 取消订阅取消信号 方法来取消订阅取消信号
7. executor函数, 如果已经要求取消了, 那么就返回, 否则就创建一个CanceledError, 同事修改promise 的状态
8. throwIfRequested方法来返回当前的 CanceledError
isCancel.js
判断当起构造器是否携带了取消信号
1. __CANCEL__ 字段是从CancelError在实例的时候带进去
utils.inherits(CanceledError, AxiosError, {
__CANCEL__: true
});
core
Axios
发送一个请求 生成最终axios构造函数结构 Axios.prototype.request; Axios.prototype.getUri; Axios.prototype.delete; Axios.prototype.get; Axios.prototype.head; Axios.prototype.options; Axios.prototype.post; Axios.prototype.put; Axios.prototype.patch;
1. 定义Axios方法, 同时为axios的interceptors定义request方法和response方法
1. 接受默认的配置参数 定义请求和响应的拦截器
2. request和response均为拦截器管理器InterceptorManager的实例
2. 定义axios的request方法
1. 因为axios传入参数的方式有好几种 需要对url参数进行预处理
2. 将我们配置的参数和原始参数进行合并
3. 对方法名进行处理
4. transitional 属性
5. 定义请求拦截器储存数组, 并将请求的拦截器塞到数组内 fulfilled 和 rejected 按顺序依次往后加
6. 定义请求拦截器都为同步. 默认的请求拦截器都为同步都为同步, 也可synchronous外部传进来参数
7. 定义相应拦截器存储数组. 并将相应的拦截器塞到数组内 fulfilled 和 rejected 按顺序依次往后加
8. 如果是异步, 也就是默认的情况, 请求拦截器塞到前面, 响应拦截器塞到后面, 循环 执行拦截器后返回promise
1. 请求流程的调用链,处理函数都是成对出现,对应Promise的resolve和rejejct处理函数,
2. 当没有添加拦截器时,默认传入的是dispatchRequest和undefine
3. dispatchRequest内部会发起真正XML的请求。 dispatchRequest函数即ajax请求函数
4. 将用户添加的请求拦截函数放入chain中,采用的是unshift插入,在后面定义的请求拦截器反而最先执行
5. 用户添加的响应拦截函数放入chain中,采用的是push方式
6. 循环执行弹出调用链中的方法,每个调用链中函数的返回值作为下一个函数的参数,最后promise拿到的就是最终的数据
9. 如果是同步, 请求拦截器一个一个的走 返回 请求前最新的config, 同时做异常捕获 有错直接抛出
10. 然后创建任务调用 dispatchRequest 来执行将请求派发出去, 遇到错误就抛出
11. 然后执行循环响应拦截器, 返回promise
3. 为Axios原型绑定getUri的方法, 通过config的配置组装url 返回请求地址
4. 为Axios原型上的 'delete', 'get', 'head', 'options' 这四个方法有可能是没有data的方法循环绑定注册的request方法
5. 为Axios原型上的 'post', 'put', 'patch' 三个方法有data方法循环绑定在Axios原型上(根据isForm判断是否需要携带Content-Type) 也是一样绑定的 request方法
AxiosError
使用指定的消息、配置、错误代码、请求和响应创建一个错误。
1. 创建AxiosError方法
1. 创建Error, call 指定为AxiosError的this
2. 创建一个Error的stack实例
3. 处理message和name和code和config和request和response等参数
2. 将Error的方法继承到AxiosError上 同时绑定toJSON方法
1. toJSON方法把相应的所有参数处理为json返回出去.
3. 创建descriptors对象来存储描述符
4. 在AxiosError上定义descriptors
5. 在AxiosError原型上定义isAxiosError值为value: true
6. 在AxiosError上定义from
1. 根据AxiosError.prototype创建对象axiosError
2. axiosError针对某些参数使用指定的AxiosError的值
3. 传入的customProps也合并到 axiosError
buildFullPath
通过结合baseURL和requestdurl创建一个新的URL,这个 buildFullPath 方法组合了 isAbsoluteURL 和 combineURLs 方法,最终目的让返回的 url 必须为一个绝对地址。
1. 如果请求的 URL 是绝对URL,此函数会原封不动地返回所请求的 URL。
2. 仅当请求的 URL 不是绝对 URL 时,才通过将 baseURL 与请求的 URL 组合来创建新 URL。
3. 否则直接返回requestedURL
dispatchRequest
使用配置的适配器向服务器发送请求。
dispatchRequest 方法最直接的执行发送请求的方法,它分为如下几步:
- 根据配置转换请求对象
- 整理请求头
- 选择一个适配器并发送请求
- 根据配置转换响应对象
- 返回响应
1. 定义方法 throwIfCancellationRequested 如果取消请求的行为已经执行,则抛出一个 Cancel 对象
1. 如果请求配置存在cancelToken取消令牌, 那么如果请求取消,抛出' CanceledError '。
2. 配置内的AbortSignal存在且aborted属性也存在, 那么抛出一个CanceledError对象
2. 定义方法dispatchRequest 使用配置的适配器向服务器发送请求。
1. 调用方法 throwIfCancellationRequested 若请求已取消,则抛出Cancel对象
2. 确保标题存在
3. 利用header和data,以及请求转换器来转换data
4. 规范化标头名称 将不合法的头规范化
5. 将请求头扁平话
6. 遍历'delete', 'get', 'head', 'post', 'put', 'patch', 'common', 清理掉headers中的请求method
7. 定义默认的请求处理adapter, 配置内没有则使用默认的
8. 定义接口处理成功和失败的返回
1. 成功则就返回响应 response
1. 若请求已取消,则抛出Cancel对象
2. 利用header和data,以及响应转换器来转换data
2. 失败就返回reject reason
1. 若请求已取消,则抛出Cancel对象
2. 添加到reason下的response属性中
InterceptorManager
请求响应拦截器 InterceptorManager 是拦截器的类,使用栈保存了自定义的拦截器,use 方法安装拦截器,eject 方法卸载拦截器,forEach 迭代每一个拦截器。
1. InterceptorManager原型上定义use方法
1. 将新拦截器添加到堆栈
2. 返回用于稍后删除拦截器的ID
2. InterceptorManager原型上定义eject方法
1. 根据ID移除对应的拦截器
3. InterceptorManager原型上定义clear方法
1. 清除所有的拦截器
4. InterceptorManager原型上定义forEach方法
1. 遍历所有注册的拦截器
2. 针对于不为null的拦截器执行传入的fn方法
mergeConfig
配置特定的合并函数,创建一个新的config-object 由于 Axios 中有默认配置、用户默认配置和用户自定义配置多种 config,所以 mergeConfig 就是用专门的规则来合并这些配置的,会返回一个新的合并后配置对象。
merge 的规则比较复杂,针对不同的属性需要有不同的合并策略:
1. 定义方法 getMergedValue 合并两个对象 两个同名属性 merge 时的规则,source 比 target 优先级高
1. 普通对象直接执行merge方法
2. 如果target不是纯对象,就把target抛弃
3. 如果source是个数组,就返回source的副本
2. 定义方法 mergeDeepProperties 合并深度属性 需要深度合并的键就执行深度合并方法
1. 如果config2中该键存在,就直接执行合并
2. 如果config2中该键不存在,但config1中该键存在,就直接取config1
3. 定义方法 valueFromConfig2 处理 如果是需要config2的键,就直接从config2中把值拿过来,绝对不会取config1
4. 定义方法 defaultToConfig2 处理config2优先的键,就优先取config2,如果没有才取config1
5. 定义方法 mergeDirectKeys 直接合并,这个跟深度合并的区别是用in来做判别,也就是undefined的区别
6. 将 config1 和 config2 的 key 全部取出来, 然就遍历
1. 定义所有参数的 mergeMap , 用于区分不同参数调用不同方法
2. 先判断需要 merge 的 类型 (不同的参数调用上面不同的方法mergeMap)
3. 如果存在这个参数格式, 就直接取到对应方法, 否则就默认的 mergeDeepProperties
4. 定义 configValue 为 merge 方法合并后的值
5. 如果 configValue 不是 isUndefined, 且这个参数的方法不是 mergeDirectKeys, 那么就把处理好的 configValue 赋值给 config
6. 最后 返回 config
settle
根据响应状态 结果是 resolve 还是 reject. 如果响应成功,则 resolve(response);如果响应失败,则用 createError 生成一个错误对象,然后 reject 掉。
1. 依据响应状态来 resolve 或 reject 一个 Promise.
2. validateStatus方法校验通过时,才会resolve
3. 否则reject一个AxiosError
transformData
transformData 方法是用来支持 transformRequest 和 transformResponse 的,transformRequest 允许在向服务器发送请求前修改请求数据,transformResponse 允许在传递结果给 then/catch 前修改响应数据。
1. 转换request或者response对象
2. 接受 要被转换的对象 和 请求或响应的header 和 单个函数或者函数数组 返回 转换后的对象
defaults
index
axios请求的默认配置及配置相关方法
1. 定义默认的content `-type DEFAULT_CONTENT_TYPE 'Content-Type': 'application/x-www-form-urlencoded `
2. 定义方法 setContentTypeIfUnset 传入头和value来设置请求头
3. 定义方法 getDefaultAdapter 来设置默认的适配器 浏览器使用 XHR adapter nodejs使用 HTTP adapter
4. 定义方法 stringifySafely 来严格化rawValue,说白了就是去除首尾空格
5. 声明默认参数变量 defaults
1. transitional: 默认过渡 option 提示标志
2. adapter 默认的适配器
3. transformRequest 请求时转化
1. 格式化 Accept 和 Content-Type
2. 如果 data 是对象且 data 是 html表单元素那么 data = new FormData(data)
3. 如 data 是 formData
1. contentType 内没有 `application/json 那么就 返回 data`.
2. 否则就将data格式化为json 然后 JSON.stringify 后 return
4. 如果 data 是 ArrayBuffer 或者 Buffer 或者 Stream 或者 File 或者 Blob 直接返回 data
5. 如果 data 是 ArrayBuffer的视图 直接返回 data.buffer
6. 如果 data 是 URLSearchParams对象,
1. 设置请求头 application/x-www-form-urlencoded;charset=utf-8
2. 返回 data 该对象的字符串
7. 返回 data
4. transformResponse 响应时转化 transformResponse 属性设计成一个数组, 是因为能更加方便的被使用, 我们可以通过传递数组,并通过一个一个函数来改造响应结果
1. 把数据转换成对象, 因为 xhr.js 文件中的取的是 responseText
2. 如果报错就抛出错误
5. timeout 中止请求的超时时间(以毫秒为单位)。如果设置为 0(默认),则不会限制超时。
6. xsrfCookieName xsrfHeaderNam XSRF的配置
7. maxContentLength maxBodyLength content和body的最大长度限制
8. env环境
9. validateStatus 校验状态,只有2开头的请求才是正常响应
10. headers 默认headers
11. 'delete', 'get', 'head', 'post', 'put', 'patch' 设置六种方法的Content-Type
transitional
transitional相关的默认数据
{
silentJSONParsing: true,
forcedJSONParsing: true,
clarifyTimeoutError: false
}
helpers
通用模块,提供内部及外部使用的方法
AxiosURLSearchParams
axios请求参数处理
1. 定义 AxiosURLSearchParams 方法 处理传入参数 params 转换为 formData
2. 在 AxiosURLSearchParams 原型上定义了 append 方法, 可以传入 name value 到 AxiosURLSearchParams 内的 _pairs
3. 在 AxiosURLSearchParams 原型上定义了 toString 方法,
1. 直接外部传入处理参数的的方法, 也支持使用内部顶部的 encode 方法
2. 使用处理方法将传入的参数的 _pairs 处理为参数字符串 a=1&b=1 的格式
bind
bind 方法主要就是用闭包和 Function.prototype.apply 方法实现了 this 指向的转换
buildURL
格式化的url(附加参数结尾)
1. 定义方法 encode
1. 正常encodeURIComponent不转义的字符: A-Z a-z 0-9 - _ . ! ~ * ' ( )
2. 先转义val,再把:$,+[]这几个字符解码回来
3. 所以最后A-Z a-z 0-9 - _ . ! ~ * ' ( ) : $ , + [ ]这几个字符不转义,其他都转义
2. 定义方法 buildURL 通过把params加到url的最后面来创建完整url
1. 如果没有 params 直接返回 url
2. 判断 url 内是否有 ('#'), 有的话 截取 url 为 从 0 到 # 这个下标的长度
3. 定义处理编码的方法
4. 定义一个 serializerParams params序列方法
1. 如果 params 是一个URLSearchParams对象, 那么就返回 params 的字符串形式,
2. 否则就 AxiosURLSearchParams 处理 params
5. 如果 serializerParams 存在, 那么就处理url 拼接上参数(存在 ? 的时候就直接拼接 &)
combineURLs
通过 baseURL 和 relativeURL 组合成为一个新得 URL
cookies
这个方法利用 IFFE 实际返回了一个对象,对象中 write、read 和 remove 方法,可以在浏览器环境中对 cookie 进行增删查改。这个方法对非浏览器环境做了兼容,在非浏览器环境中会执行一个空函数。
1. 先判断是不是标准的浏览器环境
1. 标准的浏览器环境支持 document.cookie
1. write 一个一个将cookie字段写到cookie数组内, 然后拼成字符串赋值给cookie
2. read 通过正则来读取cookie的值
3. remove 通过设置过期时间来移除cookie
2. 非标准的浏览器环境(web workers, react-native)不支持 document.cookie
1. write read remove 不做任何处理
deprecatedMethod
向开发者提供他们正在使用的方法已被弃用的警告
formDataToJSON
将FormData转成JSON的格式
fromDataURI (Undefined)
解析uri成Buffer或Blob
1. 声明 _Blob 为当参数 options.Blob || node 的 Blob
2. 声明 protocol 为 parseProtocol 方法处理 url 得到的协议
3. 如果 asBlob 参数不存在且 _Blob 存在, 那么设置asBlob为true
4. 如果 protocol 为 'data'
1. 如果protocol存在长度, 那么 uri 处理 uri.slice(protocol.length + 1) 否则就还是url
2. 根据正则DATA_URL_PATTERN搜索uri 结果赋值给 match
3. 如果match为null 那么就 new AxiosError 非法 url
4. 声明 mime isBase64 body buffer 变量
5. 如果 asBlob 为 true
1. _Blob 不存在 那么就 new AxiosError Blob不支持
2. 要么就 new Blob(([buffer], {type: mime})
6. 返回 第四部的 buffer
5. 否则就AxiosError 不支持的协议
isAbsoluteURL
判断 url 是否为绝对路径,判断的依据来源于RFC 3986 标准,根据是否以 :// 或 // 开头来判断。
// 如果 URL 以“<scheme>://”或“//”开头,则该 URL 被视为绝对url。
// RFC 3986 将 scheme 名称定义为以字母开头且后跟字母、数字、加号、句点或连字符的任意组合的字符序列。
isAxiosError
判断一个 Error 对象是否为 Axios 抛出,所有由 Axios 抛出的错误都有一个 isAxiosError 标识。
// 通过 Error对象 isAxiosError来判断
isURLSameOrigin
判断 location 和给定的 url 是否同源。在这里借助了浏览器的 a 标签进行 url 解析,然后判断协议、主机和端口是否相同。
1. 标准浏览器完全支持给定URL与当前URL是否同源的检测
1. 判断是否为IE浏览器
2. 解析一个URL,将其分解为各个部分
1. IE浏览器需要设置两次才能标准化属性
3. 最后获得的location的各个部分组成的对象
4. 判断URL与location是否同源
1. originURL = resolveURL(window.location.href)
2. parsed = resolveURL(requestURL)
3. 判断 parsed.protocol === originURL.protocol &&
parsed.host === originURL.host
2. 非标准的浏览器环境(web workers, react-native)都默认为同源
normalizeHeaderName
该方法给定了一个标准的 key,并且检查 headers 中对应的 key,如果不标准就替换为标准的头。
parseHeaders
该方法通过换行符 \n 将 headers 进行分解,转化为一个对象
// 注意:有些 key 重复了就忽略掉,有些 key 重复了就追加
// ignoreDuplicateOf 数组中的header,如果出现了重复,就忽略掉
1. 把报文头字符串解析为对象
1. 没有header就返回空对象
2. headers字符串首先通过换行符来分割为数组
3. 拿到每个header的键和值, 去除掉每个键值对key value 的首尾空字符
4. 如果key在“重复则忽略”的名单中,并且重复了,就忽略掉
5. 如果key存在
1. 如果key 为 'set-cookie', 那么这个value为数组的话直接concat val, 如果不是数组就先弄成数组在 concat
2. 普通的header,在值字符串后面追加重复的值
parseProtocol
处理得到url 的协议
spread
将数组形式的参数按次序给回调函数传参并且调用。
// 用于调用函数和扩展参数数组的语法糖。
// 常见的用法是`Function.prototype.apply`。
toFormData
将数据对象转换为FormData
1. 定义方法 isVisitable 参数为普通对象或者为数组到的时候返回true
2. 定义方法 removeBrackets 参数以 '[]' 结尾的话就删除没有的话就不处理
3. 定义方法 renderKey
4. 定义方法 isFlatArray 参数为数组且数组内每一项都不是普通对象或者数组就返回true
5. 声明变量 predicates 将 utils key 存在大写字母的方法存起来
6. 定义方法 isSpecCompliant 判断参数是否存在append且 参数是FormData格式, 且存在[Symbol.iterator]
7. 将数据对象转换为FormData
1. 如果参数不是obj就抛错 target must be an object
2. 参数formData不存在的时候new一个
3. 合并配置项options
4. 声明变量 metaTokens visitor dots indexes
5. 声明变量 _Blob options存在Blob, 且Blob也存在
6. 声明变量 useBlob 为 _Blob存在的话判断传入的formData是否符合规范
7. 如果visitor不是函数就抛错 visitor必须是函数
8. 定义函数convertValue 转换值
1. 如果是null返回''
2. 是Date返回方法返回一个 ISO格式的字符串: YYYY-MM-DDTHH:mm:ss.sssZ。时区总是 UTC(协调世界时),加一个后缀“Z”标识。
3. 如果_Blob为false(不支持Blob), 且数据是Blob就抛错 不支持Blob
4. 如果是 ArrayBuffer 或者 TypedArray, 当支持Blob的时候返回 Blob 否则根据value创建一个Buffer
9. 定义默认defaultVisitor
1. 如果value存在且path不存在且value为object
1. 如果key是{}结尾的且metaTokens为true, 那么key就删除后两位
2. value = JSON.stringify(value);
3. 返回 false
2. 如果(value 为数组且为简单一维数组) 或者 (value 为FileLIst 或者 以[]结尾 的话 返回一个新数组给arr)
1. 移除key [] 的结尾
2. 遍历arr 每项数据不为空的时候,将此项加入到FormData内
3. 如果value为普通对象或者为数组到的时候返回true
4. formData内添加此项key value
5. return false
8. 扩展defaultVisitor convertValue isVisitable 方法赋值给exposedHelpers
9. 定义方法build
1. 如果value为undefined就返回
2. 如果value已存在那么就抛错
3. 遍历value将key value 加入到formData 如果返回true 则就 还是对象 就继续执行build
10. 如果obj不是对象就抛错
11. 执行build 方法 来调用上面的方法和处理, 生成formData
toURLEncodedForm
将数据对象转换为 URLSearchParams
validator
主要是返回了 assertOptions:断言对象上的各个属性类型 validators:各种 JS 类型的校验器
1. 定义 validators:transitional
1. 定义方法formatMessage 来返回提示信息
2. 如果validator 验证器-如果已删除过渡选项,则设置为false 抛错AxiosError提示在什么版本已被删除
3. 如果版本存下且当前不存在, 那么就提示自v“version”以来已被弃用,将在不久的将来被删除
2. 定义 assertOptions 方法
1. options不是一个对象时,直接报错
2. 挨个校验选项的类型是否符合要求
3. 类型不符合要求时直接报错
4. 不允许未知选项时,直接报错
axios
入口文件axios
1. 定义方法创建实例 createInstance
1. 根据传入参数创建一个实例
2. 将原型的request方法指定到当前实例
3. 将 axios.prototype 复制到实例上
4. 将 context 复制到实例上
5. 创建新实例的工厂方法
2. 创建要导出的默认实例
3. 将 Axios 类暴露在实例上,允许类继承
4. 将 CanceledError CancelToken isCancel VERSION toFormData 暴露在实例上
5. 将 AxiosError 方法暴露在实例上
6. 将 Cancel 方法暴露在实例上
7. 将 all spread 方法暴露在实例上
8. 将 formToJSON 方法暴露在实例上
9. 将 axios 导出 module.exports = axios
10. 适配TypeScript中的import语法 module.exports.default = axios
utils
通用工具方法
1. kindOf 用于判断一个值的类型
2. kindOfTest 判断当前数据类型是否与期望的类型一致
3. isArray 确定一个值是否为数组
4. isUndefined 判断value是否为undefined
5. isBuffer 判断value是否为Buffer
6. isArrayBuffer 确定一个值是否为ArrayBuffer
7. isArrayBufferView 判断一个值是否是ArrayBuffer视图
8. isString 判断value是否为String
9. isNumber 判断value是否为Number
10. isObject 判断value是否为Object
11. isPlainObject 判断value是否为 纯Object
12. isDate 判断value是否为 Date
13. isFile 判断value是否为 File
14. isBlob 判断value是否为 Blob
15. isFileList 判断value是否为 FileList
16. isFunction 判断value是否为 Function
17. isStream 判断value是否为 Stream
18. isFormData 判断value是否为FormData
19. isURLSearchParams 判断value是否为 URLSearchParams对象
20. trim 修剪字符串前后的空白
21. isStandardBrowserEnv 判断是否运行在标准浏览器环境中
1. 允许 axios 在浏览器工作者线程和react-native中运行。两种环境都支持 XMLHttpRequest,但并不是完全标准的全局变量。
2. 浏览器工作者线程:
1. typeof window -> undefined
2. typeof document -> undefined
3. react-native:
1. navigator.product -> 'ReactNative'
4. nativescript
1. navigator.product -> 'NativeScript' or 'NS'
22. forEach 迭代数组或对象,对每一子项都执行一个回调函数
1. 是项目中大量使用的一个方法。它既可以迭代纯对象,也可以迭代数组,fn 参数是迭代过程中的回调函数。
2. 如果 `obj` 是一个数组,将会将子项值、索引和整个数组传给回调函数
3. 如果 `obj` 是一个对象,将会将子项值、子项键和整个对象传给回调函数
4. 如果obj没有值,就直接return
5. 如果obj不是一个对象,就封装成数组
6. 如果现在是数组了就 for 循环
7. 不是数组的话就 for in 循环
23. merge 是个可变参数的函数,期望每个参数都是一个对象,然后把所有的参数的属性合并,返回合并后的新对象。内部使用了 arguments 来实现的可变参数,
1. varargs 期望每个参数都是一个对象,然后合并每个对象的属性并返回新结果(原来的对象不可变)。
2. 每个参数都需要执行一遍,全都合并到result中去 递归方法,合并值到result中去(把引用类型都拆开)
24. extend 把 b 对象上的属性挨个覆盖在了 a 对象上。但是属性如果为函数,则函数的 this 指向却指向 thisArg
1. extend 其实就是把 b 对象上的属性挨个覆盖在了 a 对象上。但是属性如果为函数,则函数的 this 指向却指向 thisArg
25. stripBOM 删除Byte Order Mark。捕获 EF BB BF(UTF-8 BOM)
1. 这里的这个 BOM 不是 Browser Object Model(文档对象模型),而是 Byte Order Mark(字节顺序标记),Unicode标准 允许 UTF8 中有 BOM ,但是 UTF8 中已经不必需并且不建议使用,对 UTF8 已经毫无意义,所以删去。
26. inherits 从一个构造函数继承原型方法到另一个构造函数
27. toFlatObject 将具有深度原型链的对象解析为平面对象
28. endsWith 定字符串是否以指定字符串的字符结束
29. toArray 根据数组类对象返回新数组,失败则返回null
30. isTypedArray 判断value是否为 TypedArray
31. forEachEntry
32. matchAll 根据正则来匹配字符串所有符合的格式
33. isHTMLForm 判断value是否为 HTMLFormElement
34. hasOwnProperty 判断对象自身属性中是否具有指定的属性