Axios区分浏览器与Node.js环境及适配器运用

axios
是一个基于 Promise 的 HTTP 客户端,它可以在浏览器和 Node.js 环境中使用。为了区分当前运行环境是浏览器还是 Node.js,axios
内部使用了一些环境检测机制。具体来说,axios
通过检查全局对象来区分环境。
1. 检测全局对象
在浏览器环境中,window
对象是全局对象,而在 Node.js 环境中,global
对象是全局对象。axios
通过检查这些全局对象的存在来判断当前环境。
2. 具体实现
axios
的源码中通常会包含类似以下的代码片段:
function getDefaultAdapter() {
let adapter;
if (typeof XMLHttpRequest !== 'undefined') {
// 浏览器环境
adapter = require('./adapters/xhr');
} else if (typeof process !== 'undefined' && Object.prototype.toString.call(process) === '[object process]') {
// Node.js 环境
adapter = require('./adapters/http');
}
return adapter;
}
-
浏览器环境:
XMLHttpRequest
是浏览器特有的对象,因此在浏览器环境中,typeof XMLHttpRequest
会返回'function'
或'object'
,从而判断当前环境为浏览器。 -
Node.js 环境:
process
是 Node.js 特有的全局对象,因此在 Node.js 环境中,typeof process
会返回'object'
,并且Object.prototype.toString.call(process)
会返回'[object process]'
,从而判断当前环境为 Node.js。
3. 适配器(Adapter)
axios
使用适配器模式来处理不同环境下的 HTTP 请求。根据环境的判断结果,axios
会选择不同的适配器:
- 浏览器环境:使用
XMLHttpRequest
或fetch
作为底层实现。 - Node.js 环境:使用
http
或https
模块作为底层实现。
4. 自定义适配器
如果你有特殊需求,也可以通过 axios
的配置项 adapter
来自定义适配器,覆盖默认的环境检测逻辑。
axios({
url: '/some/url',
method: 'get',
adapter: customAdapter // 自定义适配器
});
总结
axios
通过检测全局对象(如 XMLHttpRequest
和 process
)来区分浏览器和 Node.js 环境,并根据环境选择合适的适配器来处理 HTTP 请求。这种机制使得 axios
能够在不同的环境中无缝运行。