序、React 架构设计核心学习点总览

59 阅读6分钟

通过分析 React 的架构,主要可以学习到以下解决复杂系统问题的核心思路。

React 详细架构全景图 (The Big Picture)

这张图展示了从用户交互屏幕更新的完整内部流转过程,涵盖了调度、协调(Render)、提交(Commit)三大阶段的关键函数与数据结构。

架构图一:React 分层架构设计

┌─────────────────────────────────────────────────────────────────┐
│                      应用层 (Application Layer)                  │
│  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐          │
│  │ React 组件   │  │  Hooks API   │  │   Context    │          │
│  │ (JSX/TSX)   │  │  生命周期     │  │   Provider   │          │
│  └──────────────┘  └──────────────┘  └──────────────┘          │
└─────────────────────────────────────────────────────────────────┘
                            ↓
┌─────────────────────────────────────────────────────────────────┐
│                     核心层 (Core Layer)                          │
│  ┌──────────────────────────────────────────────────────────┐  │
│  │              React 包 (react.js)                          │  │
│  │  • createElement() - 创建虚拟 DOM                         │  │
│  │  • Component/PureComponent - 组件基类                     │  │
│  │  • Hooks 定义 (useState, useEffect, etc.)                │  │
│  └──────────────────────────────────────────────────────────┘  │
└─────────────────────────────────────────────────────────────────┘
                            ↓
┌─────────────────────────────────────────────────────────────────┐
│                   协调层 (Reconciler Layer)                      │
│  ┌──────────────────────────────────────────────────────────┐  │
│  │         React Reconciler (react-reconciler)               │  │
│  │                                                            │  │
│  │  ┌─────────────┐  ┌──────────────┐  ┌─────────────────┐ │  │
│  │  │ Scheduler   │  │ Fiber 架构   │  │  Diff 算法      │ │  │
│  │  │ (调度器)    │  │ (虚拟树)     │  │  (reconcile)    │ │  │
│  │  └─────────────┘  └──────────────┘  └─────────────────┘ │  │
│  │                                                            │  │
│  │  核心职责:                                                │  │
│  │  • 维护 Fiber 树(current / workInProgress 双缓存)       │  │
│  │  • 任务调度与优先级管理                                   │  │
│  │  • 计算状态更新,生成副作用标记                           │  │
│  │  • 中断与恢复渲染工作                                     │  │
│  └──────────────────────────────────────────────────────────┘  │
└─────────────────────────────────────────────────────────────────┘
                            ↓
┌─────────────────────────────────────────────────────────────────┐
│                   渲染层 (Renderer Layer)                        │
│  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐          │
│  │ react-dom    │  │ react-native │  │ react-test-  │          │
│  │              │  │              │  │  renderer    │          │
│  └──────────────┘  └──────────────┘  └──────────────┘          │
│                                                                  │
│  核心职责:                                                      │
│  • 实现 Host Config(平台适配接口)                             │
│  • 将 Fiber 副作用翻译为真实平台操作                            │
│  • 管理事件系统(如 DOM 的合成事件)                            │
└─────────────────────────────────────────────────────────────────┘
                            ↓
┌─────────────────────────────────────────────────────────────────┐
│                   宿主环境 (Host Environment)                    │
│  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐          │
│  │  浏览器 DOM  │  │  Native UI   │  │  其他平台    │          │
│  └──────────────┘  └──────────────┘  └──────────────┘          │
└─────────────────────────────────────────────────────────────────┘

核心设计理念:
┌─────────────────────────────────────────────────────────────────┐
│ 1. 关注点分离:                                                  │
│    • react 包:只关心"描述 UI"                                   │
│    • react-reconciler:只关心"计算变化"                         │
│    • react-dom/native:只关心"执行渲染"                         │
│                                                                  │
│ 2. 依赖倒置:                                                    │
│    • Reconciler 定义抽象接口(Host Config)                     │
│    • 各 Renderer 实现具体平台细节                               │
│                                                                  │
│ 3. 可中断与恢复:                                                │
│    • Fiber 数据结构支持暂停、中断、恢复                         │
│    • Scheduler 根据优先级调度任务                               │
│                                                                  │
│ 4. 双缓存机制:                                                  │
│    • current 树:当前屏幕显示内容                               │
│    • workInProgress 树:内存中构建的新树                        │
│    • 提交时原子切换,避免中间状态                               │
└─────────────────────────────────────────────────────────────────┘

1. Fiber 架构与任务调度 (Scheduler)

架构启示:如何解决计算量导致的 UI 卡顿(CPU 瓶颈)?

  • 核心机制:将渲染任务拆分为可中断的小单元(Fiber 节点)。
  • 架构亮点
    • 协同多任务处理 (Cooperative Multitasking):浏览器主线程不仅要渲染 UI,还要执行 JS。React 通过“时间分片”主动让出主线程,保证高优先级任务(如用户输入)优先响应。
    • 双缓存机制 (Double Buffering):利用 current 树和 workInProgress 树,在内存中构建好新树后再统一提交,防止渲染撕裂。
  • 学习价值:深入理解任务优先级调度系统的设计,以及如何在单线程环境中实现异步可中断的复杂计算。

核心理念:在约束条件下(单线程、浏览器主线程资源竞争),通过合理的架构设计(任务拆分、时间切片、优先级调度、双缓存)实现复杂目标(流畅的用户体验、高优先级任务优先响应)。

2. Reconciler (协调器) 与 Renderer (渲染器) 分离

架构启示:如何设计跨平台的通用核心?

  • 核心机制react 包只包含核心逻辑(定义组件、状态),react-dom / react-native 负责具体平台的渲染。
  • 架构亮点
    • 依赖倒置与抽象层:Reconciler 计算出“树”的变化(Diff),Renderer 只需要实现一套宿主环境的 API (Host Config) 即可接入。
  • 学习价值:学习核心逻辑与副作用隔离的架构模式,这是设计跨端框架、小程序框架或通用 SDK 的基础。

核心理念:在约束条件下(多平台、不同宿主环境),通过合理的架构设计(关注点分离、依赖倒置、抽象层设计)实现复杂目标(一套核心代码、多端运行、易扩展)。

3. 代数效应 (Algebraic Effects) 与 Hooks 设计

架构启示:如何在纯函数中优雅地管理副作用与状态?

  • 核心机制:Hooks 允许组件以同步的代码风格编写包含异步数据获取、状态订阅等副作用的逻辑。
  • 架构亮点
    • 逻辑复用:打破了 Class 组件基于生命周期的逻辑割裂,实现了基于“功能”的逻辑聚合与复用(Custom Hooks)。
    • 闭包与链表:底层通过链表存储 Hook 状态,利用闭包捕获上下文。
  • 学习价值:学习逻辑复用模式的演进(Mixin -> HOC -> Render Props -> Hooks),以及如何设计极简的 Developer Experience (DX) API。

核心理念:在约束条件下(函数式编程范式、纯函数组件),通过合理的架构设计(链表存储状态、闭包捕获上下文、代数效应思想)实现复杂目标(状态管理、副作用处理、逻辑复用、极简 API)。

4. 虚拟 DOM (Virtual DOM) 与 启发式 Diff 算法

架构启示:如何在性能与开发体验之间寻找平衡点(Trade-off)?

  • 核心机制:用 JS 对象描述 UI 结构,通过 Diff 算法计算最小变更。
  • 架构亮点
    • O(n) 复杂度的启发式算法:为了将传统的 O(n^3) Diff 复杂度降下来,React 制定了三个假设(同层比较、类型不同即重建、Key 标识移动)。
    • 批处理 (Batching):多次状态更新合并为一次渲染,减少重排重绘。
  • 学习价值:学习架构中的中间层抽象 (Indirection) 思想,以及如何通过合理的假设来简化算法复杂度。

核心理念:在约束条件下(DOM 操作昂贵、性能要求高),通过合理的架构设计(中间层抽象、启发式假设、批处理优化)实现复杂目标(声明式 UI、自动化 DOM 更新、高性能渲染)。

5. 合成事件系统 (Synthetic Event)

架构启示:如何处理兼容性与内存优化?

  • 核心机制:不直接绑定原生事件,而是在 document (v17+ 在 root) 上统一监听。
  • 架构亮点
    • 事件代理 (Event Delegation):减少内存消耗。
    • 适配器模式:抹平不同浏览器的事件对象差异。
  • 学习价值:学习代理模式适配器模式在大型前端系统中的应用,以及底层的性能优化手段。

核心理念:在约束条件下(浏览器兼容性差异、海量事件监听器),通过合理的架构设计(事件代理、适配器模式、对象池复用)实现复杂目标(统一事件接口、内存优化、跨浏览器兼容)。

6. 并发模式 (Concurrent Mode) 与 useTransition

架构启示:如何提升用户感知的流畅度?

  • 核心机制:区分高优先级更新(如输入)和低优先级更新(如列表渲染)。
  • 架构亮点
    • 可中断渲染:在渲染过程中,如果有更高优先级的更新产生,可以丢弃当前工作,优先处理紧急任务。
  • 学习价值:学习用户体验驱动的架构设计,如何通过技术手段欺骗人眼(让应用"感觉"更快),以及复杂的状态转换管理

核心理念:在约束条件下(用户感知延迟、交互响应要求),通过合理的架构设计(优先级区分、可中断渲染、状态转换管理)实现复杂目标(用户体验优化、感知性能提升、复杂交互流畅)。