You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

导入已导出的Axios实例模块时,每次会创建新实例还是为单例?

每次导入Axios实例模块都会创建新实例吗?

嘿,这个问题问得很到位!答案是:你导出的这个Axios实例是单例模式的,不会每次导入都创建新实例。

原因其实和ES模块的加载机制有关:

  • ES模块采用的是「静态分析+缓存」的加载逻辑。当你的http.js模块第一次被任何文件import时,模块内的代码会被完整执行一次,此时axios.create()会生成一个实例并赋值给axiosInstance,随后这个实例会被浏览器/Node.js的模块系统缓存起来。
  • 之后不管在多少个不同的文件里重复import http from './http',模块系统都会直接返回缓存好的那个实例,不会再重新执行模块里的代码,自然也不会创建新的Axios实例了。

结合你的代码验证一下:

看你写的模块代码:

// src/utils/http.js
import axios from 'axios';
const axiosInstance = axios.create({
  baseURL: process.env.VUE_APP_API_BASE_URL,
});
export default axiosInstance;

你可以在模块里加一行日志测试:

// src/utils/http.js
import axios from 'axios';
const axiosInstance = axios.create({
  baseURL: process.env.VUE_APP_API_BASE_URL,
});
console.log('Axios实例已初始化'); // 加这行日志
export default axiosInstance;

不管你在项目里的10个还是20个文件里导入这个模块,控制台只会打印一次「Axios实例已初始化」,这就实锤了是单例。

补充个小提示:

如果哪天你真的需要每次导入都生成新实例,那可以把创建实例的逻辑包装成一个函数导出,比如:

// src/utils/http.js
import axios from 'axios';
export default function createAxiosInstance() {
  return axios.create({
    baseURL: process.env.VUE_APP_API_BASE_URL,
  });
}

这样每次调用createAxiosInstance()都会得到新的实例,但大多数场景下,单例的Axios实例才是我们想要的(比如统一配置拦截器、请求头这些)。

内容的提问来源于stack exchange,提问作者pythoniku

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:15:15