[React] 为何要自己实现调度器, 而不是直接使用 requestIdleCallback ?【热度: 236】

关键词:react 调度器 Scheduler、requestIdleCallback 使用场景

React 在性能优化方面的一个关键组件是调度器(Scheduler),它负责在渲染的过程中合理安排工作,以减少用户的等待时间以及避免单个任务占用过多的主线程时间,从而提高渲染性能。React 在 18.0 版本后引入了新的调度器机制,提供了更好的性能体验。

那么,为什么 React 不直接使用 requestIdleCallback 而要自己实现调度器呢?

  1. 控制精细度: React 需要比 requestIdleCallback 更高的控制精细度。requestIdleCallback 是基于浏览器的空闲时间进行调度的,而 React 调度器可以根据组件优先级、更新的紧急程度等信息,更精确地安排渲染的工作。

  2. 跨浏览器兼容性: requestIdleCallback 直到 2018 年才是浏览器中较普遍支持的 API。React 需要一个能够跨各个版本或框架的解决方案,以实现一致的性能体验。

  3. 时间切片: React 使用一种称为“时间切片”(time slicing)的技术,允许组件分布在多个帧中渲染以维持流畅的 UI。这依赖于 React 自己对任务和帧的精确控制,而不是依赖浏览器的 requestIdleCallback

  4. 更丰富的特性: React 调度器提供了比 requestIdleCallback 更丰富的特性和更加详细的调度策略,这包括:

    • Immediate 模式,用于同步渲染,当它是必需的时候。
    • User-blocking 模式,用于任务需要尽快完成,但能够容忍一定延迟,比如交互动画。
    • NormalLow 模式,用于不同优先级的更新。
  5. 复杂功能的实现: React 使用调度器实现某些特定的特性,比如:

    • Fiber 架构,允许 React 在类组件上实现 Concurrent 特性。
    • 在客户端渲染和服务器端渲染之间实现一致性。
  6. 优化生态工具: 对于 React 生态中的其他工具和实现(如 react-native、fast-refresh 等),它们可能需要特定或不同的调度策略。

  7. 未来兼容性: React 团队可以更好地在自己控制的调度器中实现未来的优化和特性,而不受浏览器 API 变更的影响。

最后,调度器是 React 架构中的一个重要部分,它让 React 能够实现更丰富和灵活的用户界面渲染逻辑。尽管 requestIdleCallback 可以被用来实现一些调度器的特性,但是完全使用它将限制 React 进一步优化的可能性,并迫使 React 依赖于浏览器的调度行为,这可能不符合 React 的长期发展和技术策略。