axios 实例化与全局默认配置详解:多环境API管理的正确姿势
【免费下载链接】axiosPromise based HTTP client for the browser and node.js项目地址: https://gitcode.com/GitHub_Trending/ax/axios
axios 实例化(axios.create)与全局默认配置(axios.defaults)是管理多环境、多服务 API 请求的两大核心机制。本文带你快速搞懂它们的区别、合并优先级,以及开发/测试/生产环境下 API 地址切换的最佳实践。
为什么需要 axios 实例
很多初学者习惯直接用全局的axios.get(...),但一旦项目同时对接多个后端服务(用户服务、订单服务、第三方接口),又需要区分开发、测试、生产环境,问题就来了:
- 每个请求都要手动拼完整的 API 地址,重复且易错
- 鉴权头、超时时间无处统一设置,散落在各业务代码里
- 切换环境时要全局搜索替换 URL,风险很高
axios 的答案是:一个实例绑定一份"基线配置"。实例与全局对象拥有完全相同的请求 API,只是把传入的配置作为该实例所有请求的默认值。官方文档也明确推荐:超过单文件规模的应用,都应当使用自定义实例(见 create-an-instance.md)。
一键创建 axios 实例:axios.create 用法
实例化只需要一行核心代码,配置项支持完整的 Request Config:
const api = axios.create({ baseURL: "https://api.example.com", timeout: 5000, headers: { "X-Client": "my-app" } }); const { data } = await api.get("/users/1");之后对这个实例的所有请求都会自动带上baseURL前缀和 5 秒超时。实例在源码中的创建逻辑非常清晰:axios.create内部调用createInstance生成一个 Axios 类 实例,并把请求方法绑定后挂载到对外暴露的对象上,核心入口在 lib/axios.js:
instance.create = function create(instanceConfig) { return createInstance(mergeConfig(defaultConfig, instanceConfig)); };注意这里一个细节:实例还可以从实例上继续创建实例,新实例的配置会用mergeConfig与父实例合并。这非常适合"公共基础 + 业务差异"的分层配置。
axios.defaults 全局默认配置:里面到底有什么
全局默认配置定义在 lib/defaults/index.js,它是所有实例的"出厂设置"。几个值得了解的关键项:
| 配置项 | 默认值 | 说明 |
|---|---|---|
adapter | ['xhr', 'http', 'fetch'] | 按平台自动选择请求适配器 |
timeout | 0 | 0 表示不超时 |
validateStatus | 200 ≤ status < 300 | 只有 2xx 才视为成功 |
headers.common | Accept: application/json... | 所有方法共享的请求头 |
transformRequest/Response | JSON 序列化/反序列化 | 自动处理对象与 JSON 字符串 |
修改全局配置直接写axios.defaults即可:
axios.defaults.baseURL = "https://api.example.com"; axios.defaults.timeout = 10000;但请注意官方文档中的安全警告(config-defaults.md):如果把Authorization写到全局headers.common,这个令牌会被发送到所有域名,包括你不可控的第三方接口。因此,凡是携带凭证的客户端,都应使用带独立baseURL的自定义实例。
配置合并优先级:三层覆盖规则
这是多环境管理的关键。每次发请求时,axios 会把三层配置合并成最终配置(见 lib/core/Axios.js 中的mergeConfig(this.defaults, config)调用):
- 库默认值(
lib/defaults/index.js,最低优先级) - 实例默认值(
instance.defaults) - 单次请求配置(最高优先级)
举例:
const instance = axios.create(); // timeout 继承库默认值 0 instance.defaults.timeout = 2500; // 实例级覆盖:2.5 秒 await instance.get("/slow", { timeout: 5000 }); // 该次请求:5 秒合并算法实现于 lib/core/mergeConfig.js,并非简单"后者覆盖前者":
baseURL、timeout、adapter等使用defaultToConfig2策略:请求没传才回退到实例默认url、method、data是valueFromConfig2:只取请求级配置,请求体 data 绝不会从实例或全局继承headers按字段深度合并,且键名不区分大小写
所以如果每个请求都需要共享的请求体字段,正确做法是加一个请求拦截器,而不是指望 defaults 继承。
多环境 API 管理:推荐姿势
结合上面三个知识点,一个典型的多环境多服务架构如下:
const env = import.meta.env.VITE_ENV; // dev / staging / prod const baseURL = { dev: "http://localhost:8080", staging: "https://staging.example.com", prod: "https://api.example.com" }[env]; // 每个服务一个实例,配置互不干扰 const userApi = axios.create({ baseURL, timeout: 5000, headers: { Authorization: `Bearer ${getToken()}` } }); // 实时服务用更严格的超时 const realtimeApi = axios.create({ baseURL, timeout: 2000 });这种"每服务一个实例"方案的好处:
- ✅ 令牌只发往自己的域名,杜绝泄露给第三方
- ✅ 不同服务可设不同超时、不同拦截器,逻辑隔离
- ✅ 切换环境只需改
baseURL映射表,一处生效 - ✅ 实例创建后仍可动态改默认值,比如刷新令牌后写
instance.defaults.headers.common["Authorization"]
常见误区速查
| 误区 | 正确做法 |
|---|---|
把 Token 放全局axios.defaults.headers.common | 放入专用实例的 headers,限定目标域名 |
指望defaults.data注入公共请求体 | data不从默认配置继承,用拦截器统一追加 |
| 所有服务共用一个实例 | 每个后端服务创建独立实例 |
| 每次请求传完整 URL | 实例设baseURL,请求只写相对路径 |
小结
axios.create是 axios 实例化的核心,为"一份基线配置"而生(lib/axios.js)axios.defaults是全局基线,适合无凭证的通用设置;带凭证的配置务必收敛到实例- 合并优先级:库默认 < 实例默认 < 请求配置,理解
defaultToConfig2与valueFromConfig2两类策略,就能预判任何配置项的最终取值
掌握实例化与默认配置这套组合拳,你的多环境 API 管理从此告别硬编码。更多细节可参考 docs/pages/advanced/request-config.md 与 docs/pages/advanced/headers.md。
【免费下载链接】axiosPromise based HTTP client for the browser and node.js项目地址: https://gitcode.com/GitHub_Trending/ax/axios
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考