axios是什么
axios 是一个基于 promise 的 HTTP 库,可以用于浏览器和 node.js 中。关键词:跨端、基于 promise
提示
因为本文主要介绍 axios 的适配器,所以不会介绍 axios 的用法和优点。
axios底层适配器
在 axios 源码中定义了3 个 adapters,分别是 http、xhr、fetch。
const knownAdapters = {
http: httpAdapter,
xhr: xhrAdapter,
fetch: fetchAdapter
}
httpAdapter 底层实现
httpAdapter 是 axios 的默认适配器,适用于 node 环境,它的底层实现分为2种:
- 默认使用 Node.js 的
http
模块来发送请求; - 当
config.maxRedirects
大于 0 时,引入了一个follow-redirects
库进行重定向,使用该库的http.request
或https.request
方法来发送请求。
xhrAdapter 底层实现
xhrAdapter 是 axios 的另一个适配器,适用于浏览器端请求,它直接调用了浏览器原生的 XMLHttpRequest
对象来发送请求。
fetchAdapter 底层实现
fetchAdapter 适用于浏览器请求,它直接调用了 fetch
方法来发送请求。
在调用 fetch
方法之前,使用原生的 new Request 方法创建了一个 Request 对象,在请求发送后,调用原生的 Response 对象来处理响应。
适配器的选择逻辑
axios 选择适配器的逻辑是按照一个优先级顺序进行的。通常情况下,axios 会优先尝试使用在当前环境中可用的、更现代的适配器。具体的选择逻辑可能略有不同,但大致遵循以下原则:
- 用户指定的适配器: 如果用户在请求配置中明确指定了 adapter 选项,axios 会优先使用用户指定的适配器。
- 环境检测和默认适配器: 如果用户没有指定适配器,axios 会检测当前环境。
- 在支持 fetch 的浏览器环境中: axios 可能会优先尝试使用 fetch 适配器。
- 在不支持 fetch 的浏览器环境中 (例如一些旧版浏览器): axios 会回退到使用 xhr 适配器。
- 在 node 环境中: axios 会使用 http 适配器。