前端进阶之旅前端进阶之旅
  • 基础篇HTML/CSS/JS 打底
  • 进阶篇原理与工程化
  • 高频篇面试最常问的那批
  • 精选篇按模块收敛的总结
  • 手写篇常考代码手写实现
  • 面经篇真实面试问题复盘
  • AI 篇NEWAI 时代的前端考点
  • 历年面经NEW按年份追踪真实考点
  • 每日一题每天一道,攒手感
  • 专项自测100 题快速查漏
  • 小程序题库小程序专项刷题
  • 算法题库NEW在线编码即时判题
  • 知识卡片NEW碎片时间过考点
  • 面试题大全常见问题解析
  • AI 答疑NEW随时提问,即时解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • AI 定制路线NEW按你的简历现排
  • AI 知识地图NEW串起全站知识点
  • 原理篇React / Vue 源码拆解
  • HTTP从报文一路讲到 HTTPS
  • 浏览器渲染、事件循环、进程
  • 计算机基础Linux、网络、操作系统
  • 设计模式23 种模式怎么用
  • Node学习指南从环境搭建到服务端
  • NPM工作流script、依赖与发布
  • Docker容器化部署上手
  • Canvas图形与动画实战
  • 前端系统进阶学习大型项目工程化
  • 前端综合文章长期沉淀的实践文
  • 思维导图知识点全景图
  • 学习路线按图索骥不跑偏
  • AI 热点NEWAI 每日动态
  • 公众号动态公众号历史文章
  • 博客动态站长的技术博客
  • 开发者导航常用工具与文档站
  • 基础篇HTML/CSS/JS 打底
  • 进阶篇原理与工程化
  • 高频篇面试最常问的那批
  • 精选篇按模块收敛的总结
  • 手写篇常考代码手写实现
  • 面经篇真实面试问题复盘
  • AI 篇NEWAI 时代的前端考点
  • 历年面经NEW按年份追踪真实考点
  • 每日一题每天一道,攒手感
  • 专项自测100 题快速查漏
  • 小程序题库小程序专项刷题
  • 算法题库NEW在线编码即时判题
  • 知识卡片NEW碎片时间过考点
  • 面试题大全常见问题解析
  • AI 答疑NEW随时提问,即时解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • AI 定制路线NEW按你的简历现排
  • AI 知识地图NEW串起全站知识点
  • 原理篇React / Vue 源码拆解
  • HTTP从报文一路讲到 HTTPS
  • 浏览器渲染、事件循环、进程
  • 计算机基础Linux、网络、操作系统
  • 设计模式23 种模式怎么用
  • Node学习指南从环境搭建到服务端
  • NPM工作流script、依赖与发布
  • Docker容器化部署上手
  • Canvas图形与动画实战
  • 前端系统进阶学习大型项目工程化
  • 前端综合文章长期沉淀的实践文
  • 思维导图知识点全景图
  • 学习路线按图索骥不跑偏
  • AI 热点NEWAI 每日动态
  • 公众号动态公众号历史文章
  • 博客动态站长的技术博客
  • 开发者导航常用工具与文档站
首页程序员面试题库React hydrateRoot createRoot 区别
ReReact服务端与流式渲染

hydrateRoot 与 createRoot 如何选择,React 19 还支持旧 hydrate 吗?

选择根 API 的依据是容器里已有内容的来源和所有权,不是简单地根据项目是否使用 React 18。

前端进阶之旅 · 一题精讲更新于 2026.09.06
React#服务端与流式渲染#容器化#流处理
先看核心答案读代码示例
理解线索

启动根之前确认三件事

  1. 容器来源里面是否已有同一组件和初始数据生成的 HTML
  2. 启动方式hydrateRoot 直接接收树,createRoot 后调用 render
  3. 唯一所有者一个容器由一个根管理,框架接管后不要重复创建

容器非空并不自动意味着可以 hydration;任意手写或第三方 HTML 不一定满足 React 服务端输出的对应条件。

核心回答

先记住这个答案

如果容器里已经有同一 React 树生成的服务端 HTML,应使用 hydrateRoot 并传入对应组件,让 React 尝试复用已有节点。如果是需要由客户端新建界面的容器,使用 createRoot 后调用 root.render。两者都从 react-dom/client 导入,并返回可更新和卸载的根对象。旧 react-dom 中的 render 与 hydrate 在 React 18 被弃用、在 React 19 被移除;框架通常负责这些入口,业务组件不应重复接管同一容器。

  • 已有对应 SSR HTML 使用 hydrateRoot
  • 新建客户端界面使用 createRoot 再 render
  • React 19 已移除旧 render 与 hydrate

两种启动方式对应不同初始条件

createRoot 为容器建立客户端根,首次 render 会生成这棵组件树的界面。如果容器中原本塞着 SSR 内容,再按这种方式首次渲染,就不能把原节点复用当作保证;需要复用时应走 hydration 路径。

hydrateRoot 在启动时就接收 React 节点,要求它的首次输出与现有服务端 HTML 一致。它不是检测任意 DOM 后自动猜出组件状态,也不支持把一个空的纯 CSR 容器当作已有 SSR 界面来接管。

由宿主明确决定根的启动模式TSX
import type { ReactNode } from 'react';
import { createRoot, hydrateRoot } from 'react-dom/client';

export function startApplication(
  container: HTMLElement,
  tree: ReactNode,
  mode: 'server-html' | 'client-only'
) {
  if (mode === 'server-html') {
    return hydrateRoot(container, tree);
  }
  const root = createRoot(container);
  root.render(tree);
  return root;
}

mode 由实际的服务端或客户端入口约定提供,不是通过容器有没有子节点随意猜测。宿主应只启动一次,并在真正移除该应用时调用返回根的 unmount;框架已管理入口时不需要再调用此函数。

后续更新沿用根,不要重复启动

启动后应通过组件状态或已有 root.render 更新界面,而不是每次数据变化都调用 createRoot 或 hydrateRoot。重复创建根会打乱容器所有权,也无法替代正常的组件更新和卸载管理。

对于 hydration 尚未完成的根,过早调用 root.render 可能使 React 清除服务端内容并切换整个根到客户端渲染。应优先沿用框架的数据和更新流程,避免在启动阶段另行插入抢先更新。

版本迁移要同时核对导入与行为

React 18 引入这组客户端根 API,旧入口在当时进入弃用状态;React 19 已移除旧 render 和 hydrate。只替换函数名而保留旧参数顺序、旧卸载方法或重复初始化逻辑,并不能完成正确迁移。

升级后应检查初始内容是否复用、事件是否可用、卸载是否清理,以及开发模式有没有根重复创建或 hydration 差异。若应用由 Next.js 等框架启动,应按框架升级约定处理,不能绕过框架手动接管页面根。

回答前,多想一步

容易答错的地方

看见容器非空就使用 hydrateRoot
容器可能包含加载提示、手写标记或第三方节点,这些内容未必对应传入的 React 树。入口需要明确内容生成协议;随意 hydration 会制造不匹配,而不是获得免费复用。
为每次数据变化新建一个根
根是容器的长期管理对象,不是每次更新的临时渲染命令。重复创建会产生所有权冲突和清理困难,应保存既有根或让组件状态驱动更新,并在应用真正结束时统一卸载。
试着用自己的话回答

面试官还会怎么问?

hydrateRoot 返回后能立即假定所有交互就绪吗?

不能把函数返回等同于整个页面所有边界完成接管。代码、数据和调度仍可能影响具体子树,尤其有挂起边界时;应验证目标交互实际可用,避免用返回时刻作为全页面就绪指标。

可以在一个页面有多个根吗?

可以在互不重叠的独立容器中使用多个根,例如逐步接入既有页面。每个根都需要清楚的生命周期与数据边界;使用 useId 时还应核对服务端和客户端一致的 identifierPrefix,避免标识冲突。

hydrateRoot 会自动修补所有旧 HTML 吗?

不会。它要求两端首次输出一致,官方明确不保证属性差异都被修补。发现不匹配应修复数据、结构或环境差异,不能把 hydration 当成任意 HTML 到 React 界面的自动纠错器。

从一道题,走向一组知识

把知识连起来

服务端与流式渲染

React SSR 已经输出 HTML,为什么还需要 hydration?

理解复用服务端 HTML 与建立客户端逻辑的关系。

服务端与流式渲染

React hydration 不匹配时如何恢复,会导致整个页面重建吗?

检查接管失败时的恢复范围和额外成本。

服务端与流式渲染

React 的 CSR 与 SSR 在首屏生成流程上有什么区别?

从页面生成流程判断容器的实际初始条件。

参考资料

  • React 官方:hydrateRoot
  • React 官方:createRoot
  • React 官方:React 19 升级指南

示例用于理解所注明的运行环境与边界;延伸学习可结合原文中的更多案例。

本题目录
  1. 先记住这个答案
  2. 两种启动方式对应不同初始条件
  3. 后续更新沿用根,不要重复启动
  4. 版本迁移要同时核对导入与行为
  5. 容易答错的地方
  6. 面试官还会怎么问
  7. 把知识连起来
读懂,再试着讲出来

先看核心答案,再读代码。最后展开追问,检查自己有没有遗漏边界。

试着回答追问
浏览全部面试题理解原理,也关注真实的使用场景。回到顶部 ↑