React Fiber 架构是在 React 16 版本中正式引入的。
它是一种对 React 核心算法的重构,用以替代之前的同步渲染算法,通过将渲染工作分解为更小的单元(Fiber)来实现时间切片(Time Slicing)和 Suspense 等功能,极大提升了应用性能和 UI 的响应速度。
具体来说,Fiber 是为了解决 React 16之前版本:协调(Reconciliation)机制的局限性 而设计的。
Fiber 诞生前,React面临的同步渲染困境
堆栈调和器(Stack Reconciler )
- 最大的特点:同步且不可中断; 一旦开始,就必须等它结束;
- 挑战:如果渲染的组件树特别复杂,那么将面临长时间的计算,主线程会被长时间占用;
- 导致:页面卡顿,用户体验糟糕
Fiber的核心思想:化整为零
为了解决阻塞问题,才设计了全新的调和引擎 -- Fiber Reconciler
核心:将一个庞大的更新任务,拆分为许多微小的工作单元(fiber),每完成一个工作单元后,将控制权交换给浏览器,检查是否有更高优先级的任务(例如:用户输入等),这个工程是可中断、可恢复的;
fiber是如何暂停、如何恢复更新任务的?
如果一个任务随意的暂停、恢复,是有可能将任务搞乱的,那么fiber又是如何来解决这个问题的呢?
Fiber 的两个阶段:
1. 渲染/协调阶段(Render/Reconciliation Phase)
这是一个可以被中断的 异步阶段。
- 构建“工作中”的Fiber树(work-in-progress tree)
- 计算出所有节点的变更
- 此过程可以被暂停、重做、丢弃、不会产生用户可以见的副作用
这个阶段做的所有操作都是在内存独自异步运行,不会存在Dom的操作,所以不会出现用户可见的副作用;
2. 提交阶段(commit phase)
这是一个 不可中断 的同步阶段。
- 一旦协调完成,就进入 提交阶段
- 将计算出来的所有变更一次性提交到Dom上
- 此过程必须同步,以确保UI的一致性,防止出现页面渲染一半的情况
Fiber 解决了哪些问题
1.增量渲染,避免主线程阻塞
核价值。通过将任务拆分到多个浏览器帧中执行,Fiber 极大地减少了单次JS 执行时间,让应用保持流畅响应
2.实现更新的优先级调度
任务可中断,React能为不同更新赋予不同优先级。
- ”最高优先级:用户输入(打字、点击)
- 中等优先级:动画更新
- 低优先级:网络请求返回的数据更新
3.为并发特性铺平道路
Fiber 是一种底层架构,它为 React 未来的诸多新特性提供了可能性;
我们今天熟知的 Suspense、useTransition 和 useDeferredValue 等并发特性,都建立在 Fiber 可中断和可调度的能力之上。