关键在于服务端与客户端的水合一致性:首屏内容须服务端直出并确保dom匹配,局部刷新仅限已成功水合的子树,数据、key、状态必须严格同步,否则seo失效。

关键不在“能不能局部刷新”,而在于“谁在什么时候、以什么方式控制哪一块”。服务端负责首屏语义化输出与数据一致性,客户端只接管水合后严格匹配的子树——边界清晰了,SEO 和体验才能同时稳住。
首屏内容必须由服务端直出,不可延迟或依赖 JS
搜索引擎爬虫不执行 JavaScript,也不等待 Suspense 或 lazy 加载。文章标题、摘要、导航栏、核心链接等关键内容,必须出现在初始 HTML 中,不能包裹在动态加载逻辑里。
- 避免用 React.lazy 或 Suspense 包裹首屏主区块
- 服务端渲染时,data-fetching 必须同步完成,不能留到客户端补全
- 页面 title、meta description 等需通过服务端模板变量或框架的 setHead API 静态注入,而非
document.title = ...
局部刷新区域必须满足水合一致性
所谓“组件级”,本质是划定一个服务端输出与客户端初始状态完全一致、且可被 React 安全接管的 DOM 子树。一旦 mismatch,React 会丢弃服务端 HTML,重走客户端渲染路径,SEO 内容直接失效。
seo特别版程序介绍:注意:普通用户建议使用淄博分类信息港程序普通版本。主要针对seo需要增加了自定义功能:自定义文件路径;自定义文件名;自定义关键字。这些功能的作用,只有自己体会了。以下是淄博分类信息港程序的介绍:淄博分类信息港程序一套现成的城市分类信息网站发布系统。发布管理房屋、人才、招租、招聘、求购、求租、搬迁、运输、二手交易、招生培训、婚介交友等各类信息的发布和查询。淄博分类信息港发布程序
- 每个局部刷新组件需有稳定可预测的 key(如
key={post.id}),禁用Math.random()或数组索引 - 服务端传递给该组件的 props(含
null/undefined)必须与客户端初始 props 100% 一致;推荐将初始数据序列化后内联为window.__INITIAL_DATA__ - 禁止用全局状态(如 Zustand store)直接驱动局部刷新,除非该状态的初始值已由服务端同步注入
水合过程要可观测、可兜底
水合失败不会报错,只会静默降级,你很难发现哪块内容已经脱离 SEO 覆盖。必须主动防御,把不确定性变成可控环节。
- 为每个启用局部刷新的组件包裹 ErrorBoundary,fallback 提示需支持屏幕阅读器(如
aria-live="polite") - 在服务端日志中明确标记“此响应含可水合区块:/comments、/related-posts”,便于线上监控 mismatch 率
- 可在客户端加简单校验:在
useEffect中检查document.getElementById('xxx')?.dataset.hydrated === 'true',辅助判断水合是否完成
客户端更新逻辑必须限定在水合后子树内
局部刷新不是“让某个组件自己 rerender”,而是确保更新行为只影响已被成功水合、且生命周期由 React 完全托管的 DOM 区域。
- 事件处理器(如按钮点击)触发的状态变更,应仅修改该组件或其子组件的局部状态
- 避免跨组件、跨层级的副作用调用(例如点击 A 组件导致 B 组件强制刷新),除非 B 的初始状态和服务端输出已对齐
- 使用 useTransition 或 useOptimistic 控制更新优先级,防止高频操作阻塞关键交互










