next.js 服务端渲染时因 `
` 内部缺少语义化结构(如 `` 和 `
`),导致客户端水合(hydration)失败并报错。只需为表格添加标准 html5 表格结构即可彻底解决该问题。在 Next.js(尤其是 App Router + Server Components 混合渲染场景)中,
元素的水合错误(如 Expected server HTML to contain a matching in )本质上是HTML 规范与浏览器解析行为差异引发的服务端与客户端 DOM 结构不一致问题。虽然你的原始代码在浏览器中能“显示”表格,但现代浏览器(尤其是 Chrome/Firefox)在解析无明确 /
的 时,会自动补全缺失的语义容器——服务端(Next.js 渲染器)按纯 JSX 输出未包裹的 ,而客户端浏览器却将其注入到隐式生成的
中,造成水合时节点树不匹配,从而触发严格模式下的 hydration 错误。✅ 正确写法:显式声明 和
(即使仅含一个 )"use client";
export default function TableExample() {
return (
| Company |
Contact |
Country |
| Alfreds Futterkiste |
Maria Anders |
Germany |
| Centro comercial Moctezuma |
Francisco Chang |
Mexico |
);
}⚠️ 注意事项:
- 即使只有表头或只有数据行,也必须包裹在 或
中(不可省略);
-
可选,但若使用,应

置于
之前(HTML 规范要求);- 不推荐用 div + CSS 模拟表格(牺牲可访问性与 SEO);
- 若需动态渲染表头/数据,确保 thead/tbody 始终存在,内部
可为空或条件渲染(如 {data.length > 0 && ...}),但容器标签不可缺失。? 总结:这不是 Next.js 的 Bug,而是对 HTML 标准的强制校验。遵循规范(
→ /
→ → | / |
)不仅能消除 hydration 警告,还能提升语义化、无障碍支持(screen reader 友好)和样式可控性。坚持结构化书写,让 SSR 和 CSR 安稳协同。 |