React源码解析之react16+架构的调度器

240 阅读2分钟

这是我参与8月更文挑战的第29天,活动详情查看:8月更文挑战

react16+以上的版本采用了新的设计架构,整体来说分为三层:

  • Scheduler(调度器):调度任务的优先级,高优任务优先进入Reconciler
  • Reconciler(协调器):构建Fiber数据结构,比对Fiber对象找出差异,记录Fiber对象要进行的dom操作。负责找出变化的组件
  • Renderer(渲染器):负责将变化的组件渲染到页面上

调度器

  • 什么是调度器?

  • 调度器是一种机制,判断浏览器是否有空余时间,从而来合适的调度js任务。

  • 为什么要新加调度器呢?

  • 在浏览器中加载js和渲染是一个互斥的关系,如果js在执行代码,那么渲染就会停止工作,而如果我们的js调用栈很长的话,就会导致长时间的渲染阻塞,造成的后果就是直观的表现为页面卡顿,渲染慢,用户体验差。正是为了解决这个问题,所以在react16+版本中采用了新的架构,增加了调度器。

调度的流程

首先要知道浏览器渲染是一帧一帧的进行的。

  • 每个任务都会有各自的优先级,根据优先级进行调度;
  • 在调度之前,判断当前任务是否过期,过期的话无须调度;
  • 如果任务没有过期,就通过 requestAnimationFrame 启动定时器,在重绘前调用回调方法;
  • 在回调方法中我们首先需要计算每一帧的时间以及下一帧的时间;
  • 判断当前时间是否小于下一帧时间。如果小于的话就代表我们尚有空余时间去执行任务;如果大于的话就代表当前帧已经没有空闲时间了,这时候我们需要去判断是否有任务过期,过期的话不管三七二十一还是得去执行这个任务。如果没有过期的话,当前帧又没有时间,那就只能把这个任务丢到下一帧看能不能执行了