请说明 React Fiber 架构的核心设计思想,并对比其与旧版 Stack 协调器在任务调度、组件树遍历和渲染中断恢复方面的差异,以及这些改进带来的性能优势。
考察说明
考察对 React 核心渲染机制的理解,以及能否对比新旧架构的优化点。
回答思路
- 【回答框架 1】React Fiber 是 React 16 引入的协调引擎重写,核心是可中断的增量渲染。它通过将渲染工作分解为称为 Fiber 的单元,并使用协作式调度器(如 requestIdleCallback 或基于优先级)在浏览器空闲时执行这些工作单元,从而避免长时间占用主线程。
- 【回答框架 2】旧版 Stack 算法采用递归调用遍历组件树,整个过程不可中断,一旦开始就会同步执行完整个渲染树,导致大型组件更新时阻塞主线程,出现卡顿。Fiber 将遍历方式改为链表结构,每个 Fiber 节点包含 return、child、sibling 指针,支持双向移动,从而可以部分执行并随时暂停、恢复或丢弃。
- 【回答框架 3】Fiber 引入了优先级概念,不同更新类型(如用户输入、动画、数据请求)具有不同优先级。调度器根据优先级决定先处理哪个更新,可以打断低优先级任务,保证高优先级任务(如输入响应)及时执行,同时利用时间切片分配渲染时间,实现流畅的用户界面。
- 【回答框架 4】优化方面,Fiber 支持任务的拆分和合并,通过 requestIdleCallback 或稳定调度器在浏览器空闲时段渐进式渲染;还支持错误边界、渲染阶段提交阶段的分离,以及并发模式(如 Suspense)等新特性,这些在 Stack 中难以实现。
- 【关键点 1】Fiber 的核心是可中断、可恢复的分片渲染,通过链表结构实现遍历。
- 【关键点 2】旧算法递归不可中断,Fiber 基于优先级调度,保证交互流畅。
- 【关键点 3】Fiber 通过时间切片和空闲调度避免主线程长时间阻塞。
- 【易错点 1】不要混淆 Fiber 与浏览器原生 Fiber 概念,这里指的是 React 的内部实现。
- 【易错点 2】不要误以为 Fiber 总是同步立即完成渲染,它按优先级分片执行。
- 【易错点 3】不要认为 requestIdleCallback 是所有环境都支持,React 内部有 polyfill。