
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()
}

评论
评论加载中…