2020-07-17 09:47:36
React Fiber 是对 React 核心算法的重构,旨在解决原有调度策略在复杂更新任务中导致的界面卡顿问题,通过可中断的任务拆分和优先级调度提升交互体验。以下是详细解析:
一、为什么需要 React Fiber在 React Fiber 之前,React 使用 Stack Reconciler 进行组件更新,其核心问题如下:
React Fiber 的目标:通过重构算法,将更新任务拆分为可中断的小单元,允许浏览器在空闲时执行任务,避免主线程长时间阻塞。

React Fiber 将原有的 Virtual DOM Tree 扩展为 Fiber Tree,其核心特点包括:

更新过程分为两个阶段:
自顶向下遍历 Fiber Tree,构造 WorkInProgress Tree。
每个 Fiber 节点作为一个工作单元,执行以下操作:
检查是否需要更新(如 shouldComponentUpdate)。
更新 Props、State 等状态。
为子节点创建 Fiber 节点(复用现有节点或新建)。
收集副作用(Effect List),如 DOM 操作。
通过 requestIdleCallback 调度任务,每完成一个单元后检查剩余时间,若不足则暂停,主线程空闲时恢复。
将 WorkInProgress Tree 的 Effect List 一次性应用到 DOM,确保视图一致性。

React Fiber 为任务设置不同优先级,通过以下 API 调度:
Synchronous:首屏渲染,同步执行。
Task:用户交互反馈(如输入)。
Animation:动画。
Idle:网络请求等非紧急任务。

由于 Reconcile 阶段可能多次执行,部分生命周期钩子被废弃或替换:
getDerivedStateFromProps:替代 componentWillReceiveProps,仅在需要时触发。
getSnapshotBeforeUpdate:在 Commit 阶段前捕获 DOM 信息。
componentDidCatch:处理子组件错误。
React Fiber 通过重构核心算法,解决了原有调度策略在复杂更新任务中的性能问题,为 React 提供了更灵活的任务管理和优先级调度能力。其设计思想(如链表遍历、双缓冲、增量更新)不仅提升了交互体验,也为后续功能(如并发模式、异步渲染)奠定了基础。深入理解 Fiber 的实现原理,有助于更好地优化 React 应用性能。
参考文章: