菜单

React DOM

相关源文件

React DOM 是 React 针对 DOM 的特定渲染器,它使 React 组件能够与 Web 浏览器的文档对象模型 (DOM) 交互。它实现了必要的主机配置 API,并提供了 DOM 特定功能,以桥接 React 的虚拟 DOM 与浏览器的实际 DOM。

有关使用 React DOM 进行服务器端渲染的信息,请参阅 React FizzReact 服务器组件。有关 React DOM 事件系统的详细信息,请参阅 DOM 事件系统

1. 概述

React DOM 是使用 React 构建的 Web 应用程序的主要渲染器。它将 React 组件、元素和状态更改转换为高效的 DOM 操作。

React DOM 实现了 React 协调器所需的主机环境接口,提供了 DOM 特定的方法用于:

  • 创建和操作 DOM 元素
  • 处理浏览器事件
  • 管理属性
  • 支持过渡、注水和门户等功能

图示:React 生态系统中的 React DOM

来源

2. 核心组件

React DOM 由几个关键模块组成,它们协同工作以提供 DOM 渲染功能:

组件目的
ReactDOM主要入口点,暴露顶层 API,如 rendercreateRoothydrate
ReactFiberConfigDOM主机配置接口的 DOM 特定实现
ReactDOMComponent处理 DOM 组件操作,如设置属性
ReactDOMEventListener管理 React 合成事件系统
ReactDOMUpdatePriority处理 DOM 更新的调度优先级

图示:React DOM 架构

来源

3. 主机配置实现

React DOM 实现了 React 协调器所需的主机配置接口。该实现主要由 ReactFiberConfigDOM 提供,它定义了 React 如何与浏览器 DOM 交互。

3.1 实例类型

React DOM 定义了几种类型来表示虚拟 DOM 中的 DOM 元素:

这些类型将 React 的内部表示映射到相应的 DOM 元素。

来源

3.2 元素创建

当协调器需要实例化新组件时,React DOM 会创建实际的 DOM 元素。

该实现处理:

  • 元素命名空间 (HTML, SVG, MathML)
  • 特殊元素,如 scriptselect
  • 属性初始化
  • DOM 插入

来源

3.3 DOM 变动

React DOM 支持变动操作,以响应 React 组件更新来更新 DOM。

操作功能目的
创建createInstance()创建新的 DOM 元素
更新commitUpdate()更新元素属性
文本更新commitTextUpdate()更新文本内容
插入appendChild(), insertBefore()将元素添加到 DOM
删除removeChild()从 DOM 中移除元素

这些操作经过优化,以最大限度地减少 DOM 交互。

来源

图示:DOM 变动操作

来源

4. 事件处理

React DOM 实现了一个复杂的事件系统,该系统规范化了不同浏览器之间的事件,并提供了事件委托和合成事件等附加功能。

4.1 事件系统架构

React DOM 使用事件委托,将大多数事件监听器附加到根 DOM 容器,而不是单个元素。当事件冒泡到容器时,React 会识别应该处理事件的 React 组件,并向其分派一个合成事件。

事件系统:

  1. 注册支持事件的监听器
  2. 规范化浏览器差异
  3. 实现事件池以提高性能
  4. 提供捕获阶段处理等额外功能

来源

4.2 事件优先级

React DOM 为事件分配了不同的优先级,这有助于确定相关更新应以多快的速度处理。

这种优先级划分对于确保响应式交互同时高效地批处理不那么关键的更新至关重要。

来源

5. 视图过渡

React DOM 支持 View Transitions API,允许在 UI 的不同状态之间进行平滑动画。

5.1 视图过渡支持

视图过渡系统通过以下方式实现不同 UI 状态之间的过渡:

  1. 捕获当前状态
  2. 应用过渡效果
  3. 渲染新状态
  4. 在两个状态之间进行动画

来源

图示:视图过渡流程

来源

6. 与协调器集成

React DOM 旨在与 React 协调器无缝协作,后者处理 React 组件的核心更新逻辑。

6.1 协调器集成

协调器在协调过程中的特定点调用 React DOM 的主机配置函数:

  1. 渲染阶段,协调器构建一个描述要进行的更改的效果树。
  2. 提交阶段,协调器调用特定的 DOM 方法来应用这些更改。

来源

6.2 主机上下文

React DOM 提供上下文信息,以帮助协调器对元素做出适当的决策。

此上下文有助于特殊元素(如 SVG 和 MathML)的命名空间处理。

来源

7. 跨平台考量

React DOM 专门为 Web 浏览器设计,但 React 的架构允许有多个针对不同平台的渲染器。

7.1 与其他渲染器的比较

React 在不同平台之间保持一致的 API,同时实现特定于平台的渲染器。

渲染器目标平台主要区别
React DOMWeb 浏览器使用浏览器 DOM API
React Native移动(iOS/Android)使用原生 UI 组件
React 测试渲染器测试内存中表示
React ArtCanvas/SVG图形导向 API

每个渲染器都实现了相同的主机配置接口,但具有特定于平台的行为。

来源

图示:React 渲染器架构

来源

8. 性能考量

React DOM 包含多项优化,以确保高效的 DOM 操作和响应式用户界面。

8.1 DOM 操作批处理

React DOM 批处理 DOM 变动,以最大限度地减少布局抖动并提高性能。

  • 多重样式更新被批处理为单个操作
  • 元素创建和插入经过优化
  • 文本内容更新得到高效处理

8.2 事件系统效率

事件系统使用委托来最大限度地减少事件监听器的数量

  • 大多数事件都附加到根容器
  • 合成事件尽可能重用
  • 事件与 React fiber 相关联,以便高效分派

来源

结论

React DOM 是 React 的虚拟 DOM 与浏览器实际 DOM 之间必不可少的桥梁。它提供了所有 DOM 特定的实现细节,使 React 能够高效地创建、更新和管理 Web UI。通过实现 React 协调器所需的主机配置接口,React DOM 使 React 的组件模型能够在 Web 浏览器中无缝工作,同时优化性能和开发者体验。