什么是Fiber?
React Fiber是React16提出的新概念,它的诞生是为了让React更快,更智能。
Fiber reconciler也变成了React16以及更高版本的默认reconciler。是对React中的diff算法的一次重写。用来解决React中的一些问题,比如:卡顿、不可中断的渲染、不可中断的事件处理等。
通俗的说Fiber reconciler就是我们常说的diff算法。
Meta曾经在一个发布会中用一个视频来介绍Fiber reconciler,这个视频是React16发布会的一部分,可以在这里看到。
为什么要重写diff算法?
React的diff算法是基于递归,如果你学过一些算法,那么你就知道,在React中的diff算法是使用了深度优先遍历的方式。
深度优先遍历的算法的时间复杂度是非常高的,所以当一个界面的节点数量很多的时候,diff算法的时间复杂度就会很高,这样就会导致界面的卡顿。
而到了React16中,Fiber reconciler是基于循环的,它将递归的过程拆分成一个个的任务,每个任务完成后,会将控制权交还给浏览器,让浏览器有机会去处理其他的任务,比如用户的交互事件。这样就可以保证页面的流畅性。
同时,拆分出的任务还拥有优先级的概念,所以在渲染的时候,可以根据任务的优先级来进行渲染,这样就可以保证重要的任务能够被及时的渲染出来。
而在React中,任务的优先级是根据任务的类型来进行划分的,比如说用户的交互事件的优先级是最高的,所以在用户的交互事件发生的时候,会立即响应,而不是等待其他的任务完成后再去响应。
而控制任务的优先级的概念就是Lane,Lane是基于Fiber reconciler的,所以Lane只能在React16及以上的版本中使用。
在React18之前,Lane是没有被默认启用的,而在React18中,Lane已经被默认启用,如果要在React18之前使用Lane,那么需要在创建根节点的时候,传入enableSchedulerTracing: true。
为什么要引入Lane模型?
正如上面所说,为了更好的用户体验,那么有些东西必须要优先进行渲染,比如用户的交互事件,这些事件的优先级是最高的。如果用户点击了按钮,那么就必须要立即响应,而不是等待其他的任务完成后再去响应。
为什么要学习Fiber?
我们学习React的核心就是要学习它的diff算法、它的渲染机制,而这些都是基于Fiber的,所以如果我们要吃透React,那么就得从Fiber开始。
参考资料:
https://github.com/acdlite/react-fiber-architecture
https://blog.logrocket.com/deep-dive-react-fiber/