从自定义 .js 文件访问应用程序上下文以获取语言环境消息

Accessing app context from custom .js files for fetching locale messages

我正在 SSR 模式下使用 Nuxt.js 构建 Vue.js 应用程序。我的项目中有 axiosvue-i18n 插件。

nuxt.config.js :

export default {
  mode: 'universal',
  // some irrelevant configs
  modules: [
    '@nuxtjs/axios',
    'nuxt-i18n',
  ],
  i18n: {
    locales: [
      {
        code: 'en',
        name: 'English',
        file: 'en-EN.js'
      },
      {
        code: 'de',
        name: 'Deutsch',
        file: 'de-DE.js'
      }],
    defaultLocale: 'en',
    vueI18n: {
      fallbackLocale: 'en',
    },
    lazy: true,
    langDir: 'locales/',
    vuex: {
      moduleName: 'i18n',
      syncLocale: true,
      syncMessages: true,
      syncRouteParams: true
    },
  },
  /* Axios module configuration */
  axios: {}
}

如您所见,i18n 设置为 惰性 加载。消息取自 locales/en-EN.jslocales/de-DE.js 文件。在我想向后端 api 发出请求的文件中,它将为我提供消息。 locales/en-EN.js :

export default async function (context) {
  return await context.$axios.get('backend-api');
}

然而,当我加载页面时,它说 $axios 未定义:Cannot read property 'get' of undefined。但是,一旦我开始在语言之间切换,应用程序就会收到翻译。所以我的猜测是服务器在尝试从上下文访问 $axios 时失败,但在客户端(浏览器)上它成功了。从 Nuxt context 访问 $axios 模块的正确方法是什么?

所以我猜问题是在插件注入期间调用了语言环境文件 (i18n),因此 axios 在应用上下文中尚不可用。

所以我找到了解决方法:

首先,我导入了 plain axios(除了 nuxt 模块)

npm i axios -S

然后在语言环境文件中,我在导出函数中导入了它的实例:

// en-En.js
export default async function (context) {

  // axios is derived directly from lib instead of context
  const axios = require('axios').default;

  let localeMessages = null

  await axios.get(
      'backend-api'
  ).then((result) => {
    localeMessages = result.data
  }).catch(() => {
    localeMessages = {}
  });

  return localeMessages
}

仍然不确定这是否是一种有效的方法,但目前它有效