Skip to content
Discussion options

You must be logged in to vote

这是一个经典的 SSR 水合不匹配(hydration mismatch) 问题。

原因:

服务端渲染时,服务器不知道用户当前选择的语言是什么,所以始终使用你配置的 default: 'zh-CN' 来渲染 HTML。而客户端 hydrate 时,Umi 的 locale 插件会从 localStorage(或 navigator.language)读取到用户之前切换的语言(比如 en-US),导致客户端渲染出来的文本和服务端不一致,React 就会抛出这个警告。

解决方案:让服务端也能感知到用户的语言偏好。

方案 1:通过 Cookie 传递语言信息(推荐)

切换语言时,将当前语言写入 Cookie,服务端从请求的 Cookie 中读取语言:

1)切换语言时同步写入 Cookie:

import { setLocale } from 'umi';

function changeLanguage(lang: string) {
  // 写入 cookie,确保服务端能读到
  document.cookie = `umi_locale=${lang}; path=/; max-age=31536000`;
  setLocale(lang);
}

2)在服务端入口(app.ts)中,通过请求头获取 Cookie 并设置初始语言:

// app.ts
export const ssr = {
  modifyServerRenderData(data: any) {
    const { request } = data;
    // 从 cookie 中解析语言

Replies: 1 comment

Comment options

You must be logged in to vote
0 replies
Answer selected by parker-super
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Category
Q&A
Labels
None yet
2 participants