Skip to content

React 项目实践

如何实现 React 应用的国际化和主题切换?

国际化和主题是运行时契约问题,要同时处理文本、格式、路由、首屏一致性和设计 token。

适合阶段:高级前端 / 资深前端核心能力:国际化 · 主题系统 · SSR 一致性

面试官想考什么

  • 语言由 URL、Cookie 还是浏览器偏好决定? 考察产品和技术取舍。
  • 如何避免首屏语言闪烁和 hydration mismatch? 考察渲染一致性。
  • 日期、数字、复数和 RTL 如何处理? 考察完整性。
  • 主题如何避免组件各自写颜色? 考察 Design System 思维。

一句话回答

text
国际化要统一语言确定、资源加载和格式化策略,主题要通过语义 token 驱动,并保证服务端首屏与客户端接管使用同一上下文。

面试回答详解

1. 语言策略

语言优先级可以是显式 URL、用户设置、Cookie、浏览器偏好,必须定义冲突时的规则。翻译资源按语言和路由/领域拆分,避免首屏加载全部词条。

2. 格式化

使用 Intl 或成熟库处理日期、数字、货币、时区、复数和相对时间。不要把字符串拼接当成复数规则,也不要在服务端和客户端使用不同 locale。

3. 主题策略

用 CSS variables 和语义 token 表达 surface/text/border/action,组件不直接依赖品牌色。主题切换要提前设置初始属性,减少闪烁;用户偏好、系统偏好和租户主题要有优先级。

4. 生产边界

测试长文本、缺失翻译、RTL、字体、日期边界、无障碍对比度和缓存隔离。翻译资源加载失败要有默认语言或局部降级,不应让整页白屏。

可直接背诵的 30 秒回答

text
我会先确定语言来源和优先级,再按路由或领域加载翻译资源,使用 Intl 处理日期、数字、货币和复数。主题通过语义 CSS token 驱动,首屏和客户端使用同一语言与主题上下文,避免闪烁和 hydration mismatch。测试会覆盖长文本、RTL、缺失翻译、时区和可访问性。

扩展知识

多语言检查清单

  • URL 和 SEO 是否可被分享和索引?
  • 服务端与客户端 locale 是否一致?
  • 翻译资源是否按需加载?
  • 文本变长后布局是否仍然可用?
  • 日期、数字、货币和时区是否使用统一规则?

面试官追问链

追问一:为什么会出现 hydration mismatch?

  • 考察点:是否理解首屏确定性。
  • 回答方向:检查服务端和客户端 locale、时区、随机值、时间、系统主题和异步资源是否不同;把非确定性移出首次渲染。

追问二:主题切换为什么会闪烁?

  • 考察点:是否有首屏性能和体验意识。
  • 回答方向:在渲染前确定主题属性或使用服务端/Cookie 上下文,避免依赖 hydration 后才写入 DOM。

追问三:缺少翻译 key 怎么办?

  • 考察点:是否有降级策略。
  • 回答方向:开发期构建告警,运行时显示默认语言或安全 fallback,同时上报 key、语言和版本。

推荐阅读

基于 MIT 协议开源