Vite-SSG + Vue I18n 完整配置指南
hi, 好久不见,我的博客终于又开始更新啦!
想知道我这段时间干啥去了, 等着我下一篇日志吧!(不知何时)
本文档基于实际项目经验,详细介绍了如何在 Vue 3 项目中正确配置和使用 Vite-SSG 与 Vue I18n 的集成方案。
项目概述
这是一个基于 Vue 3 的多语言静态站点项目,使用 Vite-SSG 进行静态站点生成,集成了 Vue I18n 进行国际化支持。
核心依赖版本
推荐的依赖版本组合
1 | { |
重要说明:
-
@intlify/unplugin-vue-i18n 版本必须使用 v4.0.0,v11.0.0 版本存在兼容性问题
-
vite-ssg 和 vue-i18n 的版本组合需要严格匹配
1. 项目结构
1 | src/ |
2. Vite 配置 (vite.config.ts)
1 | import { defineConfig } from "vite"; |
关键配置说明
-
VueI18n 插件: 自动处理语言文件的导入和编译
-
strictMessage: false: 允许缺失的翻译键,避免构建失败
-
ssr.noExternal: SSG 环境下的重要配置,解决 vue-i18n 在 SSR 中的问题
3. i18n 配置
语言配置文件 (src/i18n/config.ts)
1 | export type Locale = "zh" | "en-US" | "ja-JP" | "ko-KR"; |
主入口文件 (src/main.ts) - SSG 兼容方案
方案一:虚拟模块导入(推荐用于开发环境)
1 | import { ViteSSG } from "vite-ssg"; |
方案二:直接 JSON 导入(SSG 生产环境推荐)
1 | import { ViteSSG } from "vite-ssg"; |
4. 多语言路由配置
路由文件 (src/router/index.ts)
1 | import { createRouter, createWebHistory } from "vue-router"; |
路由命名规则
-
基础路由名称:
home
,Login
,Register
-
多语言路由名称:
zh-home
,en-US-Login
,ja-JP-Register
-
子路由名称:
zh-feature-beautify
,en-US-feature-enhance
5. 语言文件结构
语言文件示例 (src/locales/zh.json)
1 | { |
6. 组件中使用 i18n
基础使用方式
1 | <template> |
动态路由跳转
1 | <template> |
语言切换组件 - 增强版(支持 localStorage 持久化)
1 | <template> |
7. 功能国际化 Composable
1 | // src/composables/useFeatureI18n.ts |
8. 构建脚本
package.json
1 | { |
9. 常见问题和解决方案
1. SSG 水合问题 - 显示占位符文本
问题: 静态生成后的网页显示 home.hero.title
等占位符文字,而不是实际翻译内容
根本原因: 虚拟模块导入在 SSG 环境下无法正确处理,导致水合时消息对象为空
解决方案:
1 | // 替换虚拟模块导入为直接 JSON 导入 |
2. 语言切换在静态构建中失效
问题: 开发环境语言切换正常,但静态构建后语言切换无效
解决方案:
-
添加 localStorage 持久化:
1 | // 在 main.ts 中添加 |
-
更新语言切换组件:
1 | const changeLanguage = (newLocale: Locale) => { |
3. SSG 构建失败
问题: The requested module '@intlify/shared' does not provide an export named 'incrementer'
解决方案:
1 | // 将 @intlify/unplugin-vue-i18n 版本降级到 4.0.0 |
4. 路由匹配警告
问题: No match found for location with path /zh/feature/beautify
解决方案:
-
检查路由配置中的
requiresAuth
是否阻止了 SSG 渲染 -
确保子路由名称正确生成
-
移除 SSG 不支持的路由守卫
5. 翻译键缺失
问题: 构建时因缺失翻译键而失败
解决方案:
1 | // vite.config.ts |
6. 开发环境路由警告
问题: 开发时出现路由匹配警告
解决方案:
-
使用
getLocalizedPath
函数生成正确的路由路径 -
确保所有硬编码的路由路径都替换为本地化路径
10. SSG 兼容性最佳实践
1. 导入策略
开发环境: 使用虚拟模块导入(热重载友好)
1 | import messages from "@intlify/unplugin-vue-i18n/messages"; |
生产环境: 使用直接 JSON 导入(SSG 兼容)
1 | import zhMessages from "./locales/zh.json"; |
2. 状态管理
SSR 状态同步:
1 | if (import.meta.env.SSR) { |
客户端状态恢复:
1 | if (isClient) { |
3. 构建优化
预构建验证:
1 | # 开发构建 |
静态文件检查:
-
检查
dist/
目录下的 HTML 文件是否包含正确的翻译内容 -
验证多语言路由是否正确生成
-
确认语言切换功能在静态环境中正常工作
11. 最佳实践
1. 版本管理
-
严格遵循推荐的依赖版本组合
-
定期更新依赖,但要注意兼容性
2. 路由设计
-
使用 URL 路径作为语言标识
-
为每个语言版本生成独立的路由
-
确保路由名称的唯一性
3. 性能优化
-
使用虚拟模块导入语言文件
-
按需加载语言资源
-
合理使用 SSR 状态同步
4. 开发体验
-
提供 TypeScript 类型支持
-
使用 composables 封装常用功能
-
保持代码结构清晰
12. 部署注意事项
1. 静态资源
-
确保所有静态资源路径正确
-
配置正确的 base URL
2. 路由配置
-
配置服务器的 URL 重写规则
-
确保多语言路由正常工作
3. 缓存策略
-
为不同语言版本设置适当的缓存
-
考虑语言切换时的缓存更新
总结
本配置指南提供了一个完整的 Vite-SSG + Vue I18n 集成方案,包括:
-
正确的依赖版本组合
-
完整的配置文件示例
-
多语言路由实现
-
组件中使用 i18n 的最佳实践
-
常见问题的解决方案
-
SSG 兼容性最佳实践
-
性能优化建议
按照此指南配置,可以构建一个功能完善、性能优良的多语言静态站点。
重要更新说明
2025 年更新: 基于实际项目经验,文档新增了以下关键内容:
-
SSG 水合问题解决方案: 详细解决了静态构建显示占位符文本的问题
-
语言持久化机制: 添加 localStorage 支持确保语言设置在静态环境中正常工作
-
双重导入策略: 提供开发环境和生产环境的不同导入方案
-
状态管理优化: 完善了 SSR 状态同步和客户端状态恢复机制
-
构建验证流程: 新增静态文件检查和验证步骤
这些更新确保了 Vite-SSG + Vue I18n 在真实生产环境中的稳定性和可靠性。
参考资源
Vite-SSG + Vue I18n 完整配置指南