React Fiber 架构原理与调度机制
本文由一缘原创整理,系统梳理 React Fiber 架构的核心原理、调度机制、并发渲染与优先级,适合所有 React/前端进阶开发者。
React Fiber 架构原理与调度机制
Fiber 是 React 16 引入的全新架构,支持并发渲染、任务分片和更灵活的调度。
1. 为什么要有 Fiber?
- 传统 Stack Reconciler 递归不可中断,导致大树更新卡顿
- Fiber 支持任务分片、可中断、优先级调度,实现流畅响应
2. Fiber 数据结构
- Fiber 是一个 JS 对象,描述 UI 树的每个节点
- 包含 type、key、stateNode、child、sibling、return、effectTag 等属性
const fiber = {
type: 'div',
key: null,
stateNode: domNode,
child: childFiber,
sibling: siblingFiber,
return: parentFiber,
effectTag: 'UPDATE',
// ...
};
3. Fiber 架构核心流程
- Reconciliation(协调):构建 Fiber 树,标记变更
- Commit(提交):将变更同步到 DOM
- 任务分为“可中断的工作单元”
4. 并发渲染与优先级
- React 18 支持并发特性(Concurrent Mode)
- 任务有不同优先级(如用户输入 > 数据请求 > 动画)
- 通过 requestIdleCallback 或 Scheduler 实现任务切片
function workLoop(deadline) {
while (nextUnitOfWork && deadline.timeRemaining() > 1) {
nextUnitOfWork = performUnitOfWork(nextUnitOfWork);
}
if (nextUnitOfWork) {
requestIdleCallback(workLoop);
}
}
requestIdleCallback(workLoop);
5. Fiber 协调算法(Reconciliation)
- 通过 key、type 判断节点复用/删除/新增
- 只遍历一层子节点,提升性能
// 简化版 diff 算法
function reconcileChildren(parentFiber, elements) {
let oldFiber = parentFiber.child;
let prevSibling = null;
elements.forEach((el, i) => {
let newFiber = {
type: el.type,
key: el.key,
stateNode: null,
return: parentFiber,
effectTag: oldFiber ? 'UPDATE' : 'PLACEMENT',
};
if (i === 0) parentFiber.child = newFiber;
else prevSibling.sibling = newFiber;
prevSibling = newFiber;
if (oldFiber) oldFiber = oldFiber.sibling;
});
}
6. Fiber 的双缓存机制(双缓冲)
- current Fiber 树:已挂载的 UI
- workInProgress Fiber 树:本次更新的新树
- 交换指针,提升性能
7. React 任务调度流程
- setState/props 触发更新,生成 update 对象
- 调度器(Scheduler)根据优先级插入任务队列
- 执行 workLoop,构建 Fiber 树
- 空闲时提交(commit)到 DOM
8. 并发特性与 Suspense
- Suspense 支持异步组件、数据流
- startTransition 降低任务优先级,提升交互流畅度
import { startTransition } from 'react';
startTransition(() => {
setValue(input);
});
9. Fiber 架构的最佳实践
- 合理使用 key,避免不必要的重渲染
- 拆分大组件,减少 Fiber 树深度
- 善用 React.memo/useMemo/useCallback 优化性能
- 关注 React DevTools Profiler
10. 总结
Fiber 架构让 React 拥有了更强的可扩展性和性能,理解其原理有助于写出更高效、可维护的前端应用。