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

如何在ES6模块中访问@nuxtjs/axios的模块实例

你直接导入@nuxtjs/axios或者原生axios拿不到项目中已经配置好的实例,因为@nuxtjs/axios是Nuxt专属模块,它会基于你的配置生成专属实例,通过Nuxt运行时上下文注入到组件、Vuex中,直接导入原始包不会携带你项目中的baseURL、拦截器等配置,所以请求无法正常执行。

以下是两种可行的解决方法:

方案1:全局挂载实例(适合通用工具类模块调用)

  1. 新增axios插件,在plugins目录下新建axios.js:
export default ({ $axios }, inject) => {
  // 保留Nuxt原有注入逻辑
  inject('axios', $axios)
  // 挂载到全局环境供普通ES6模块调用
  if (process.client) {
    window.__NUXT_AXIOS_INSTANCE__ = $axios
  } else {
    global.__NUXT_AXIOS_INSTANCE__ = $axios
  }
}
  1. 在nuxt.config.js中注册该插件:
modules: [
  '@nuxtjs/axios',
],
plugins: [
  '~/plugins/axios'
]
  1. 在普通ES6模块中调用:
// 你的自定义ES6模块,比如/utils/request.js
const getAxios = () => {
  return process.client ? window.__NUXT_AXIOS_INSTANCE__ : global.__NUXT_AXIOS_INSTANCE__
}

// 封装请求
export const getList = async (params) => {
  const axios = getAxios()
  return axios.get('/api/list', { params })
}

方案2:参数透传(适合业务封装模块调用,更安全)

如果你的ES6模块仅在组件、Vuex等能拿到注入实例的场景调用,可以直接将$axios作为参数传入,不需要全局挂载:

  1. 封装请求的ES6模块:
// /api/goods.js
export const getGoodsDetail = (axios, goodsId) => {
  return axios.get(`/api/goods/${goodsId}`)
}
  1. 组件内调用时传入实例:
import { getGoodsDetail } from '~/api/goods'

export default {
  async asyncData({ $axios }) {
    const detail = await getGoodsDetail($axios, 1001)
    return { detail }
  }
}

注意事项

  • 不要在Nuxt初始化完成前调用全局挂载的axios实例,此时实例还未挂载会返回undefined
  • 优先使用方案2,避免全局变量污染,逻辑更清晰可追溯

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 07:36:01