React Fiber源码分析 (介绍)

 写了分析源码的文章后, 总觉得缺少了什么, 在这里补一个整体的总结,输出个人的理解~

文章的系列标题为Fiber源码分析, 那么什么是Fiber,官方给出的解释是:

React Fiber是对核心算法的一次重新实现。

ummm, 这样说实在是有点泛,详细分析一下

 

 

先从开发者角度来看 

实际上这次更新对于我们来说影响并不大,只是几个生命周期改变了,新引入的两个生命周期函数 getDerivedStateFromPropsgetSnapshotBeforeUpdate 以及在未来 v17.0 版本中即将被移除的三个生命周期函数componentWillMount,componentWillReeiveProps,componentWillUpdate,目前版本并不会影响原生命周期的使用,但不能和新的生命周期一起使用,也会被标记为不安全,下图为目前React的流程图:

 

其他的几乎没有任何影响,我们还是照常的写着原来的代码,然后我们就感觉到网页性能更高了一些。

 

 

为什么网页性能会变高,Fiber做了什么?

要回答这个问题,需要回头看javascript是单线程的知识点。

单线程一次只能做一件事, 在原来的React中, 如果一次更新的时间比较长,那么用户就会感觉到卡顿,也就是丢帧了。

打个比方, 假如我现在要更新1000个组件(往大了说),每个组件平均花时间1ms,那么在1s内,浏览器的整个线程都被阻塞了,这时候用户在input上的任何操作都不会有反应,等到更新完毕,界面上突的一下就显示了原来用户的输入,这个体验是非常差的。这里借用官方一张图, Fiber之前的版本就是这样,调用栈非常深

 

那么Fiber,现在是怎么做呢?

Fiber实际上是把一次更新拆成一个个的单元任务,每次做完一个单元任务后,就询问是否有更高的优先级任务,有就去执行,回头再来干这件事,如图

那么就明白了,Fiber是一个任务调和器!, 同样,我们根据这个来分析Fiber具体做了什么

 

 

Fiber具体做了什么

首先,要做到这样的效果,那么就需要有以下的功能:

1.可分片  (拆分任务)

2.可中断   (执行另一个任务后, 可以回头继续执行未完成的任务)

3.具备优先级 (哪个任务先执行)

 

想要做到拆分任务就需要任务可以分片,也就是React的Fiber,fiber即为一个分片任务,贴上数据结构:

可中断即是使用了队列的形式保存任务, 具体可以看源码~

基本是一个fiber即为一个组件,而优先级即使用fiber的expirationTime属性, expirationTime越小即优先级越高

复制代码
function FiberNode(tag, pendingProps, key, mode) {   // Instance  this.tag = tag;   this.key = key;   this.elementType = null;   this.type = null;   this.stateNode = null;    // Fiber  this.return = null;   this.child = null;   this.sibling = null;   this.index = 0;    this.ref = null;    this.pendingProps = pendingProps;   this.memoizedProps = null;   this.updateQueue = null;   this.memoizedState = null;   this.firstContextDependency = null;    this.mode = mode;    // Effects  this.effectTag = NoEffect;   this.nextEffect = null;    this.firstEffect = null;   this.lastEffect = null;    this.expirationTime = NoWork;   

                    
                
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信