React Stack vs Fiber 架构对比

对比 React Stack Reconciler 与 Fiber 架构在可中断性、调度方式和性能表现上的差异。

#tech / dev / frontend #type / synthesis #status / growing #package / react

[!info] related notes

React Stack vs Fiber 架构对比

这篇笔记回答一个问题:React 为什么要从 Stack 架构演进到 Fiber 架构,以及两者的核心差异。

为什么要把这两个架构放在一起理解

Fiber 不是凭空设计的,而是直接针对 Stack Reconciler 的痛点做改进。不理解 Stack 的局限,就很难理解 Fiber 为什么需要工作单元、链表和时间分片。

对比表

维度Stack ReconcilerFiber
遍历方式递归调用栈循环 + Fiber 链表
可中断性不可中断,一次性完成可暂停、恢复、丢弃
调度无优先级,全部同等对待支持优先级调度
主线程占用可能长时间阻塞分片执行,每片约 5ms
数据结构组件树(隐式调用栈)Fiber 节点树(显式链表)
引入版本React 15 及之前React 16+

演进路径

Stack 的问题

React 15 使用 Stack Reconciler,递归遍历组件树进行 diff。一旦开始就无法中断,组件树较大时会长时间占用主线程,导致:

  • 用户输入延迟
  • 动画掉帧
  • 页面卡顿

Fiber 的解决方案

React 16 引入 Fiber,核心改进:

  1. 工作单元化:把整棵树 diff 拆成多个小任务(work unit)
  2. 可中断调度:每个任务执行完后检查是否还有时间,没有就让出主线程
  3. 优先级调度:用户交互 > 数据获取 > 后台任务
  4. 链表结构:每个 Fiber 节点有 child、sibling、return 指针,用循环代替递归

面试回答模板

旧版 Stack Reconciler 采用递归方式一次性完成整棵组件树的 diff,过程不可中断,复杂场景下容易阻塞主线程。Fiber 的核心改进是把更新拆成更细的工作单元,让 React 可以暂停、恢复和按优先级调度更新,从而改善大更新场景下的响应性。

常见易混淆点

  • “Fiber 比 Stack 快” -> 不一定,Fiber 的关键是可中断和可调度,不是绝对速度
  • “Fiber 不需要优化组件” -> 错误,Fiber 只是让调度更灵活,组件本身的性能仍然重要
  • “Stack 架构完全被淘汰” -> 理解 Stack 仍然有助于理解 Fiber 的改进动机
创建于 2026/4/3 更新于 2026/5/27