perf(frontend): U48 i18n locale 懒加载 — en-US JSON 动态导入拆分为独立 chunk

问题: src/i18n/index.ts 静态导入 zh-CN.json (200KB compact) + en-US.json
(292KB compact),两者共 486KB 全部内联到主 index chunk,致主 chunk 696KB
超过 Vite 600KB 警告阈值。

修复:
- src/i18n/index.ts: 移除 en-US.json 静态导入,改为 ensureLocaleLoaded()
  动态导入 + i18n.addResourceBundle() 按需加载
- zh-CN (默认/回退语言) 保持静态内联,无行为变化
- en-US 仅在用户切换英文时按需 fetch (290KB 独立 chunk)
- 已选英文的用户刷新页面时异步加载 en-US (短暂中文闪烁,可接受)
- src/store/index.ts: setLanguage 调用 ensureLocaleLoaded 确保目标语言包
  加载完成后再切换

结果:
- 主 index chunk: 696KB → 423KB (-39%, -273KB)
- en-US chunk: 290KB 独立懒加载 (仅英文用户首次切换时 fetch)
- Vite 600KB chunk 警告消除
- tsc -b=0, npm build✓ (18.18s), ESLint=0/43/any=0, go build=0
- 17/17 集成测试通过, Docker healthy
This commit is contained in:
attacker committed 2026-07-17 01:49:25 +08:00
1 parent ca036a85ca
commit 8e211b64af
2 files changed
+35 -5

No files matched your search

+3 -2
View File
@@ -29,9 +29,10 @@ export const useLanguageStore = create<LanguageState>()(
(set) => ({
language: "zh-CN" as AppLanguage,
setLanguage: (lang) => {
// 同步切换 i18next 实例
// Ensure the target locale bundle is loaded (en-US is lazy) before switching.
import("@/i18n")
.then(({ default: i18n }) => {
.then(async ({ default: i18n, ensureLocaleLoaded }) => {
await ensureLocaleLoaded(lang);
i18n.changeLanguage(lang);
})
.catch(() => {