渐进式剖析React源码(1):宏观理解fiber架构

128 阅读3分钟

image.png

react作为当今热门的框架语言,源码的学习显得尤为必要,但当着手去学习的时候,发现源码内容太多、复杂度太高,根本无从下手。刚开始学习时,一脸茫然和懵逼,后续则不了了之,只好放弃。

image.png

此系列文章目的在于帮助大家从0开始一步步渐进式的理解react底层运行原理。

文章是在react18源码基础上进行剖析,作为系列文章的开篇,不得不谈fiber架构,这是react的构成,从思想上先理解架构,后续我们会针对细节再逐一击破;话不多说,我们发车吧!!!

image.png

  1. fiber架构是什么?
  2. fiber架构如何工作?
  3. fiber解决了什么问题?

要弄明白以上的问题,首先得明白在react16之前的stack架构遇到的问题。

设想下,当我们的react应用十分庞大,也就意味着我们可能有成千上万个组件,我们具有棵嵌套层级很深的virtual dom tree,每当触发更新,这棵树就开始递归元素逐一diff,导致js运行的时间过长。 image.png

我们知道渲染主线程同一时间只能做一件事情,要么是js运行要么是渲染,js运行过久势必造成页面动画渲染出现卡顿、用户交互的行为无法立马反馈出来,这样的体验是糟糕的。

而fiber架构的出现带来了异步渲染的概念,不会再继续进行长时间的diff过程,这就是第三个问题的答案。

fiber架构中分为三层:调度层、协调层、渲染层

  • 调度层------调度任务的优先级,高优任务优先进入协调器

  • 协调层------构建整颗fiber数据结构并记录和收集副作用

  • 渲染层------将标记的副作用渲染到页面中

我们把这3层的工作可以简单的串联下:

react把原先一个完整的diff任务拆成颗粒度更细的任务,给每个小任务分配5ms的js执行时间,当时间到达后,不管任务是否完成,调度层会对任务进行优先级的编排,取出优先级更高的任务,将其推入协调层中(这就是调度层做的事情)

协调层拿到任务后,会构建fiber的数据结构(fiber数据结构会在后续文章进一步阐述),这里可以类比于加强版的virtual dom,在构建的过程中会进行副作用标记(标记哪些节点需要增加、删除、更新)等等。

渲染层拿到协调层构建出来的fiber数据结构,针对副作用调用dom Api 完成页面渲染

fiber架构.png

以上就是回答了前2点的问题。

总结:fiber架构带来了异步渲染,将任务拆解并区分优先级,解决了之前stack架构的痛点。

随着我们对架构的初步理解,相信大家也会有更多的疑问:

  1. 任务的优先级在react中具体是如何区分和排序?
  2. fiber数据结构是什么样子?如何构建这样的数据结构?目的是什么?
  3. 副作用是如何标记?
  4. 。。。。
  5. 。。。。

后续的文章会针对每个点进行概念、源码对照以及流程图进行一一解读,敬请期待~~