Nuxt3 工具函数里调用 useI18n 报错的排查

在 Nuxt3 里写多语言 SEO 元信息的工具函数 useSeoMetaForPage() 时,报错指向了 useHead()

const { t } = useI18n({ useScope: 'global' })
...
useHead({
  title: t('meta.global.title'),
  ...
})

把代码贴给 GPT,它也说 useHead 不能在 setup 外使用。但 Nuxt 文档明确写了 useHead 可以在组件外调用,这个解释说不通

真正的报错点是 useI18n

逐行注释掉之后发现,报错的是上面那行 useI18n(),不是 useHead()

useI18n() 需要组件上下文,只能在 setup() 里调用。工具函数被调用时上下文已经不在了,所以注入失败,报错信息却落在了后面第一个用到 t 的地方

试过把 const { t } = useI18n() 提到模块顶层复用,结果更糟,模块加载阶段直接崩

不依赖上下文的写法是通过 useNuxtApp() 调用:

const title = useNuxtApp().$i18n.t('meta.global.title')

懒加载的语言包还没准备好

i18n 配置里开了 lazy: true

i18n: {
  lazy: true,
  langDir: 'locales',
  locales: [
    { code: 'zh', file: 'zh.json' },
    { code: 'en', file: 'en.json' },
  ],
}

语言文件是异步加载的,切换语言后立刻调用 t(),拿到的可能是空字符串

解决方法是先等语言包加载完,再刷新 meta:

export async function updateSeoMetaWithLocale(locale: 'zh' | 'en') {
  await useNuxtApp().$i18n.loadLocaleMessages(locale)
  await nextTick()
  useSeoMetaForPage()
}

评论

评论加载中…

输入关键词开始搜索。

选择Enter 打开Esc 关闭CtrlK 唤起