当前位置: 首页 > news >正文

React 核心工作流程两阶段:Render 阶段和 Commit 阶段

一、Render 阶段 (The Render Phase)

关键词:可中断、纯计算、虚拟 DOM、Fiber

  • 做什么:
    • React 从根组件开始,递归地调用所有组件函数(或类组件的render方法)。
    • 根据当前的propsstate,计算出新的React Element 树(即虚拟 DOM)。
    • 将新树与旧树进行对比(Diffing),找出差异。
    • 标记出哪些节点需要新增、更新、删除或移动。这些标记被称为副作用(Effects)
  • 核心特性:
    • 纯函数 (Pure):这个阶段不能产生任何“副作用”(如修改全局变量、发起网络请求、直接操作 DOM)。因为如果渲染过程中断或重试,这些副作用可能会重复执行或导致状态不一致。
    • 可中断 (Interruptible):这是 React 16+ 引入Fiber 架构后的最大变革。React 将这个庞大的任务拆分成许多小的工作单元(Unit of Work)。如果浏览器主线程繁忙(例如用户正在打字),React 可以暂停渲染,让出控制权给浏览器,等空闲了再回来继续。这意味着 Render 阶段可能会执行多次,甚至被丢弃重做。
  • 产出物:
    • 一棵带有副作用标记的WorkInProgress 树(内存中的新树),准备用于下一步。

二、Commit 阶段 (The Commit Phase)

关键词:不可中断、副作用、真实 DOM、同步

  • 做什么:
    • React 将 Render 阶段计算出的变更,真正应用到屏幕上。
    • 执行所有标记好的副作用,具体包括三个子步骤:
      1. Before Mutation:读取最新的 DOM 信息(主要用于getSnapshotBeforeUpdateuseLayoutEffect的依赖收集)。
      2. Mutation:真正操作真实 DOM(增删改节点)。
      3. Layout:执行布局相关的副作用(如componentDidMount,componentDidUpdate,useLayoutEffect)。
      4. (注:useEffectcomponentDidMount的部分逻辑通常在浏览器绘制屏幕后异步执行,但也属于广义的提交后处理)
  • 核心特性:
    • 同步且不可中断 (Synchronous & Non-interruptible):一旦进入 Commit 阶段,React 必须一口气做完所有工作,不能暂停。因为此时已经在操作真实的 DOM,如果中途暂停,用户会看到界面处于“半更新”的闪烁或不一致状态。
    • 性能瓶颈:由于不可中断,如果 Commit 阶段耗时过长(例如更新了成千上万个节点),会直接阻塞浏览器主线程,导致页面卡顿(掉帧)。因此,优化 React 性能的关键往往在于减少 Commit 阶段的工作量,或者利用并发特性将工作分摊到 Render 阶段。
  • 产出物:
    • 用户最终看到的、更新后的真实 UI 界面

为什么通常只说这两个阶段?

因为在 React 的源码实现和核心设计理念中,“调度(Scheduler)”并不是一个独立的执行阶段,而是一个管理机制

  • 调度器 (Scheduler)负责决定:“现在是不是该开始 Render 阶段了?”、“Render 阶段做了多久了?要不要暂停?”、“哪个更新优先级更高?”。
  • 它像是在 Render 阶段外面包裹的一层“指挥官”,指挥 Render 阶段何时运行、运行多久,但它本身不执行具体的组件渲染或 DOM 操作。

所以,当我们讨论 React内部执行流程时,最本质的划分就是:

  1. (Render):在内存里算清楚该怎么变(可以慢慢算,随时停)。
  2. (Commit):动手把屏幕改了(必须快,不能停)。
[触发更新] ↓ [Scheduler 调度] <--- (决定优先级和时间切片) ↓ [ 1. Render 阶段 ] - 调用组件 - 生成 Virtual DOM - Diff 对比 - 标记副作用 (✅ 可中断,可重试) ↓ [ 2. Commit 阶段 ] - 更新真实 DOM - 执行 useLayoutEffect - 执行生命周期 (❌ 不可中断,同步执行) ↓ [ 浏览器绘制屏幕 (Paint) ] ↓ [ 执行 useEffect (异步) ]

这种“两阶段”模型是理解 React 性能优化(如memo,useMemo,useCallback主要是优化 Render 阶段;代码分割主要是减少初次 Commit 负担)以及并发特性(Concurrent Features)的基础。

http://www.jsqmd.com/news/520045/

相关文章:

  • C语言实现CAN FD高可靠通信:手把手教你绕过ISO 11898-1:2015标准陷阱的7个关键配置点
  • Python模块与包管理完全指南:从入门到精通
  • JDK 26 正式发布:十一大新特性深度解读
  • 2026年最新最全Java面试题汇总汇一览表!
  • GLM-OCR入门:3步完成CSDN星图GPU平台一键部署与测试
  • 苍穹外卖day02记录
  • 《动手学深度学习》-69BERT预训练实现
  • MiniMax M2.7 完成你的不可能,但缺不认识马嘉祺
  • java毕业设计基于springboot昆嵛山国家级自然保护区林业资源信息管理系统
  • SLAM数据集实战:如何利用TUM、KITTI、EuRoC的真实轨迹文件进行算法评估与优化
  • 二维静态表达到三维动态建模:仓储空间管理能力的结构性升级—— 基于镜像视界“像素即坐标”与轨迹建模的空间智能体系
  • ROS2实战:当CMU自主探索算法遇上Livox MID-360,我是如何搞定实车部署的?
  • Hunyuan-MT-7B-WEBUI问题解决:部署常见错误与一键修复方案
  • 解锁FreeSWITCH隐藏功能:用API实现智能电话会议自动化
  • Activiti审批流避坑指南:SpringBoot整合时${}和#{}的5个易错点
  • CoPaw模型效果深度解析:生成高质量技术文档与代码注释
  • nRF51 SDK超低功耗BLE开发核心架构与实战
  • nlp_structbert_sentence-similarity_chinese-large 服务监控与日志排查指南
  • 用Python重现经典:Theil-Sen与Mann-Kendall分析遥感NPP数据(附完整代码与结果解读)
  • 手写签名提取工具(图片)
  • Kook Zimage真实幻想Turbo从零开始:WebUI界面功能逐项解析
  • 量子测量实战:用Python模拟薛定谔的猫实验(附完整代码)
  • 嵌入式SPI-DAC通用驱动库设计与实践
  • Spring_couplet_generation 模型部署详解:Ubuntu系统环境配置全流程
  • PP-DocLayoutV3入门指南:快速部署镜像,一键分析文档标题正文表格
  • 从“灌水神刊”到“严审阵地”:MDPI与Frontiers系列期刊发文量锐减背后的质量转向
  • R3:重塑 .NET 响应式编程的事件流处理与性能优化实践
  • FireRedASR-AED-L模型跨平台部署:从x86服务器到ARM开发板的尝试
  • Leather Dress Collection惊艳案例:Leather Shirt Skirt通勤风+皮革自然褶皱光影渲染
  • 深入解析DSP系统时钟配置与优化策略