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

如何从打包后的组件中访问同一I18nContext?

解决UI组件库中useTranslation返回undefined的问题

下面是同场景下开发者实测有效的解决方案:

1. 把i18n相关依赖设为peerDependencies

组件库不要把i18next、react-i18next打包进产物,而是声明为peer依赖,让宿主项目提供统一的实例,避免多实例导致上下文丢失。

  • 修改组件库的package.json:
{
  "peerDependencies": {
    "i18next": "^22.0.0",
    "react-i18next": "^12.0.0",
    "react": "^18.0.0"
  },
  "devDependencies": {
    "i18next": "^22.0.0",
    "react-i18next": "^12.0.0"
  }
}

2. 修正Vite的external配置

确保组件库的Vite配置中,i18n相关依赖的external和全局变量映射正确:

import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';

export default defineConfig({
  plugins: [react()],
  build: {
    lib: {
      entry: 'src/index.js',
      name: 'MyUIComponent',
      formats: ['es', 'umd']
    },
    rollupOptions: {
      external: ['react', 'react-dom', 'i18next', 'react-i18next'],
      output: {
        globals: {
          react: 'React',
          'react-dom': 'ReactDOM',
          i18next: 'i18next',
          'react-i18next': 'reactI18next'
        }
      }
    }
  }
});

3. 组件库不自行初始化i18n实例

组件库只负责调用翻译钩子,i18n的初始化和Provider包裹完全交给宿主项目:

// 宿主项目根组件
import { I18nextProvider } from 'react-i18next';
import i18n from './i18n-config'; // 宿主自定义的i18n配置
import { MyComponent } from 'your-ui-library';

function App() {
  return (
    <I18nextProvider i18n={i18n}>
      <MyComponent />
    </I18nextProvider>
  );
}

组件库内的子组件直接使用useTranslation即可:

// 组件库中的子组件
import { useTranslation } from 'react-i18next';

export function MyComponent() {
  const { t, i18n } = useTranslation();
  return <div>{t('hello')}</div>;
}

4. 排查并修复重复依赖问题

如果宿主项目和组件库存在重复的i18n依赖,会导致多实例冲突。执行以下命令检查:

npm ls i18next

若发现重复依赖,在宿主项目的package.json中强制统一版本:

{
  "overrides": {
    "i18next": "^22.0.0",
    "react-i18next": "^12.0.0"
  }
}

5. 备选:使用withTranslation高阶组件

若useTranslation钩子仍有问题,可尝试用高阶组件包裹组件,解决上下文传递异常:

import { withTranslation } from 'react-i18next';

function MyComponent({ t, i18n }) {
  return <div>{t('hello')}</div>;
}

export default withTranslation()(MyComponent);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 08:22:17