# Fiber及其工作原理
# Fiber 架构简介
Fiber 是 React 16 中引入的新协调引擎,它是对 React 核心算法的完全重写,旨在解决 React 15 和之前版本中的性能问题。
Fiber 架构的核心目标:
- 能够将渲染工作分片
- 能够为不同类型的更新分配优先级
- 能够暂停、中止或重用渲染工作
- 能够在父子组件之间更灵活地传递信息
# 为什么需要 Fiber
在 React 15 及之前的版本中,React 使用的是递归的方式进行协调过程(Reconciliation),这种方式被称为"栈协调器"(Stack Reconciler)。当组件树很大时,递归更新可能会阻塞主线程,导致一些问题:
- 无法中断渲染,必须一次性完成所有工作
- 动画和用户输入等高优先级工作无法及时响应,导致页面卡顿
- 如果渲染时间过长,可能导致帧率下降,影响用户体验
# Fiber 的工作原理
# Fiber 数据结构
Fiber 是一种链表结构,每个 Fiber 节点对应一个 React 元素,包含如下重要信息:
{
// 标记 Fiber 类型(函数组件/类组件/文本/宿主组件等)
tag: WorkTag,
// 指向父、子、兄弟节点的指针,形成树结构
return: Fiber | null, // 父节点
child: Fiber | null, // 第一个子节点
sibling: Fiber | null, // 下一个兄弟节点
// 节点状态和更新信息
pendingProps: any, // 新的待处理属性
memoizedProps: any, // 已处理的属性
memoizedState: any, // 组件状态
updateQueue: UpdateQueue<any> | null, // 更新队列
// 与渲染输出相关
stateNode: any, // 宿主组件实例(如 DOM 节点)
// 工作标记(用于调度)
flags: Flags,
// 指向备用 Fiber 的指针(双缓存)
alternate: Fiber | null,
}
# 双缓存机制
Fiber 架构采用双缓存(Double Buffering)技术:
- current Fiber 树:当前已经渲染到屏幕上的树
- workInProgress Fiber 树:正在构建的新树
这种机制使 React 能够在后台构建完整的 UI 树,而不影响当前显示的内容。只有当新树完全准备好时,React 才会一次性地切换到这个新树,从而减少中间状态导致的视觉不一致。
# 工作循环与时间切片
Fiber 架构的核心是其工作循环(work loop),它可以被中断:
function workLoop(deadline) {
// 是否应该让出控制权
let shouldYield = false;
// 有工作要做且不需要让出控制权
while (nextUnitOfWork && !shouldYield) {
// 执行一个工作单元并返回下一个工作单元
nextUnitOfWork = performUnitOfWork(nextUnitOfWork);
// 检查是否还有剩余时间
shouldYield = deadline.timeRemaining() < 1;
}
// 如果没有下一个工作单元但有待处理的工作,请求下一次调度
if (!nextUnitOfWork && workInProgressRoot) {
commitRoot();
}
// 安排下一次工作
requestIdleCallback(workLoop);
}
这种实现使 React 能够:
- 在浏览器空闲时间执行渲染工作
- 在必要时暂停渲染,让出主线程以处理高优先级的事件
- 为不同类型的更新分配不同的优先级
# Fiber 执行的两个阶段
Fiber 渲染过程分为两个阶段:
Render 阶段(可中断):
- 构建 Fiber 树
- 计算变更
- 可以被中断、重启、放弃
Commit 阶段(不可中断):
- 将变更应用到 DOM
- 调用生命周期方法
- 一旦开始就必须同步完成
# Fiber 带来的优势
- 提高应用响应性:通过时间切片,避免长时间阻塞主线程
- 优先级调度:可以根据任务的紧急程度分配优先级,优先处理用户交互
- 更细粒度的更新:能够暂停、中止或重用渲染工作
- 并发模式的基础:为 React 18 中的并发特性奠定了基础
- 更好的错误处理:可以在不影响整个应用的情况下处理错误
# 与 React 18 并发特性的关系
Fiber 架构为 React 18 中的并发渲染提供了基础设施。在 React 18 中,新引入的特性如 useTransition
、useDeferredValue
和自动批处理都是建立在 Fiber 架构之上的。
通过 Fiber 架构,React 能够实现真正的"并发渲染",即同时准备多个版本的 UI,并根据优先级决定先渲染哪个,从而提供更流畅的用户体验。