广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >详解React Fiber的工作原理
  • 695
分享到

详解React Fiber的工作原理

2024-04-02 19:04:59 695人浏览 薄情痞子
摘要

目录啥是React Fiber? 为什么会有React Fiber? React Fiber到底怎么工作的? React Fiber的实现原理 React Fiber对我们日常开发有

啥是React Fiber?

React Fiber,简单来说就是一个从React v16开始引入的新协调引擎,用来实现Virtual DOM的增量渲染。

说人话:就是一种能让React视图更新过程变得更加流畅顺滑的处理手法。

我们都知道:进程大,线程小。而Fiber(纤维)是一种比线程还要细粒度的处理机制。从这个单词也可以猜测:React Fiber会很“细”。到底怎么个细法,我们接着往下看。

为什么会有React Fiber?

之前说了,React Fiber是为了让React的视图更新过程变得更加流畅顺滑。怎么,之前React的视图更新不流畅,不顺滑了?

还真是的,在React v16之前,React的视图更新确实存在很大的性能问题,其中首当其冲的,就是它的同步更新机制。

在React决定要加载或更新一颗组件树之前,会大致做出如下一系列动作:调用各组件的生命周期函数 --> 计算和对比Virtual DOM --> 更新真实的DOM树。这个过程是同步的,也就是说,一旦这个过程开始,它就会一鼓作气跑完,一直到真实DOM树更新完毕。

然而,当组件树比较庞大时,这种机制的问题就来了:一颗拥有300个组件的组件树需要全部更新,假设一个组件更新只需耗时1ms,整棵树更新一次就需要耗时300ms。在这300ms期间,浏览器的主线程一直在“专心致志”地忙着更新这颗组件树(这时函数的调用栈会非常长),对于页面上的任何操作都是“不闻不问”的。在这期间,假如用户在一个输入框敲了几个字,页面上也不会有任何反应,因为渲染按键输入结果也需要主线程来做,然而此时主线程正忙着更新组件树呢。等到300ms结束了,浏览器主线程有空了,才把刚刚敲的那几个字渲染到input输入框内。

太卡了,真的。

由于javascript的单线程工作特点,业内一直有个这样的原则:任何动作都不要长时间霸占主线程,如果迟迟不归还主线程,那么在这期间程序就没法对其他输入作出响应。输入了却没有响应,或者说响应来的很慢,也就是我们常常说的“卡顿”。显然,React的同步更新机制在组件树庞大时就违反了这一原则,犯了大忌。

这就是React Fiber出现的原因:为了解决旧版React视图更新的性能瓶颈。

React Fiber到底怎么工作的?

首先,React Fiber并没有解决更新庞大组件树耗时长的问题,实际上总的耗时还是一样的长。但是它解决了一个被广大开发者口诛笔伐的恶行:长时间霸占主线程不放。

而它解决的方法就是:分片。

它的工作原理是这样的:把耗时长的更新任务拆解成一个个小的任务分片,每执行完一个小的任务分片,都归还一次主线程,看看有没有什么其他紧急任务要做。如果在归还主线程时恰巧发现有紧急任务,那么会马上停掉当前更新任务,转而让主线程去做紧急任务,等主线程做完紧急任务,再重新做更新任务。(注意⚠️:是重新!不是从上次被打断的点继续);如果没有紧急任务,才敢唯唯诺诺地继续做接下来的任务分片。

简单来说,就是降了视图更新的优先级,把更新过程碎片化。

现在我们捋一捋,React Fiber会这样处理一个更新过程:

  1. 将一个更新过程分为Reconciliation阶段和Commit阶段,Reconciliation阶段(调度阶段)会更新数据并生成新的虚拟DOM,并且对新旧的虚拟DOM进行diff,得到需要更新的元素,放到新的更新队列中;而Commit阶段(渲染阶段)则会遍历更新队列,并且将所有的变更一次性更新到真实DOM中;
  2. 对于Reconciliation阶段进行分片处理,这个阶段可以被更紧急的任务打断,分片任务做到一半可能要重来;
  3. 对于Commit阶段,直接一鼓作气把DOM更新完,不能被打断。

React Fiber的实现原理

React Fiber实现的难点有两个:暂停/重启如何实现?任务如何分散执行?

对于前者,暂停/重启意味着我们需要保存状态,这里在实现上用到了具有链表和指针的“单链表树遍历算法”,能够记录遍历过程中的上一步和下一步。

而对于后者,则用到了requestAnimationFramerequestIdelCallback这两个api,其中requestAnimationFrame是浏览器在每一帧都一定会执行的,可以放一些高优先级的任务;而requestIdelCallback则是浏览器在一帧中最后如果有空闲时间才会去执行,可以放一些低优先级的任务,需要polyfill(因为兼容性不佳)。

React Fiber对我们日常开发有什么影响?

React Fiber在Reconciliation阶段可能会调用以下生命周期函数(这也意味着在这个阶段的生命周期函数在一次加载和更新过程中可能会被多次调用):

  • componentWillMount
  • componentWillUpdate
  • componentWillReceiveProps
  • shouldComponentUpdate

如果你恰巧没有上react hooks的车,而是使用传统的类组件进行开发,那么切记,不要在以上几个生命周期函数中做只需要做一次的操作(比如:页面初始化时发起一个ajax请求获取数据)。

如果你平常使用react hooks进行开发,那没事了,就当看了个热闹。

以上就是详解React Fiber的工作原理的详细内容,更多关于React Fiber的工作原理的资料请关注编程网其它相关文章!

--结束END--

本文标题: 详解React Fiber的工作原理

本文链接: https://www.lsjlt.com/news/124233.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 详解React Fiber的工作原理
    目录啥是React Fiber? 为什么会有React Fiber? React Fiber到底怎么工作的? React Fiber的实现原理 React Fiber对我们日常开发有...
    99+
    2022-11-12
  • 详解React Fiber架构原理
    目录一、概述二、Fiber架构2.1 执行单元2.2 数据结构2.3 Fiber链表结构2.4 Fiber节点2.5 API2.5.1 requestAnimationFrame2....
    99+
    2022-11-13
    React Fiber原理 React Fiber架构
  • React Fiber 链表操作及原理示例详解
    目录正文什么是FiberFiber节点React源码Fiber树是链表节点独立节省操作时间与单向操作利于双缓存与异步可中断更新操作异步可中断更新双缓存正文 看了React源码之后相信...
    99+
    2022-11-13
    React Fiber 链表操作 React Fiber
  • react fiber执行原理示例解析
    目录为什么要使用fiber,要解决什么问题fiber是什么?数据结构执行单元浏览器工作:Fiber执行原理workInProgress tree:currentFiber tree:...
    99+
    2022-11-13
    react fiber执行原理 react fiber
  • 怎么理解的React Fiber
    本篇内容主要讲解“怎么理解的React Fiber”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么理解的React Fiber”吧!Fiber出现的背景在早期的 React 版本中,也就是 R...
    99+
    2023-06-27
  • React调度系统Scheduler工作原理详解
    目录简介什么是Scheduler?Scheduler的工作原理使用Scheduler的场景代码示例1. 延迟执行任务2. 调整任务的优先级3. 批量更新状态总结简介 React是目...
    99+
    2023-03-13
    React Scheduler调度系统 React Scheduler
  • React 原理详解
    目录1.setState() 说明1.1 更新数据1.2 推荐语法1.3 第二个参数2.JSX 语法的转化过程3.组件更新机制4.组件性能优化4.1 减轻 state4.2 避免不必...
    99+
    2022-11-12
  • Springboot工作原理详解
    目录 一、Spring Boot 1.1.Spring Boot 优点  二、SpringBoot 运行原理 1.1. pom.xml  2.2. 主启动类的配置 3.3. 主启动类的运行 三、自动配置原理 3.1、启动类上注解的作用  3...
    99+
    2023-10-10
    spring boot java spring
  • 详解MyBatis工作原理
    目录一、Mybatis工作原理二、Mybatis运行原理总结一、Mybatis工作原理 Mybatis分层框架图 Mybatis工作原理图 源码分析:一般都是从helloworl...
    99+
    2022-11-12
  • SELINUX工作原理详解
    1. 简介 SElinux带给Linux的主要价值是:提供了一个灵活的,可配置的MAC机制。     Security-Enhanced Linux (SELinux)由以下两部分组成: ...
    99+
    2022-06-04
    SELINUX 工作原理
  • Spring @Transactional工作原理详解
    本文将深入研究Spring的事务管理。主要介绍@Transactional在底层是如何工作的。之后的文章将介绍:propagation(事务传播)和isolation(隔离性)等属性的使用事务使用的陷阱有哪些以及如何避免JPA和事务管理很重...
    99+
    2023-05-30
  • 详解React Hooks是如何工作的
    目录1. React Hooks VS 纯函数2. 简单 myUseState3. 改进 myUseState4. 实现原理引发的 Hooks 规则1. React Hooks VS...
    99+
    2022-11-12
  • 详解时间轮TimeWheel的工作原理
    目录一.时间轮介绍1.时间轮的简单介绍2.传统的计时器功能实现方式3.时间轮计时器实现思路的简单介绍二.不同实现方式的时间轮的介绍单层多轮次时间轮多层时间轮三.时间轮实现的源码级分析...
    99+
    2023-02-17
    时间轮TimeWheel原理 时间轮TimeWheel 时间轮原理
  • 详解Android JetPack之LiveData的工作原理
    目录前言 介绍 原理分析 前言 本篇文章主要讲解LiveData工作的原理,如果还不知道LiveData如何用的话,请参考官方文档。 LiveData的讲解涉及到了Lifecycl...
    99+
    2022-11-11
  • 详解Python描述符的工作原理
    目录一、前言二、什么是描述符?三、描述符协议四、描述符的工作原理五、数据描述符和非数据描述符六、描述符的使用场景七、function与method八、property/staticm...
    99+
    2022-11-12
  • Cookie的工作原理和应用详解
    目录1. Cookie 原理1.1 Cookie 背景信息1.2 Cookie 工作原理1.3 Cookie 创建、获取、修改1.4 Cookie 共享范围1.5 Cookie 生命...
    99+
    2022-11-12
  • C语言scanf的工作原理详解
    目录原理解释解决办法总结原理解释 先来观察一段代码和运行结果: #include <iostream> using namespace std; int main()...
    99+
    2022-11-12
  • Docker工作模式及原理详解
    如下图所示: 我们在使用虚拟机和docker的时候,就会出现这样一个疑问:Docker为什么比VM虚拟机快呢? 上面这张图就很客观的说明了这个问题 1、Docker有着比虚拟机更...
    99+
    2022-11-12
  • RocketMQ Namesrv架构工作原理详解
    目录1 概念2 核心数据结构和API2.1 Namesrv的核心数据结构2.2 Namesrv的API3 Namesrv架构3.1组件3.2 Namesrv四个功能模块1 概念 Na...
    99+
    2022-11-13
    RocketMQ Namesrv架构 Namesrv架构
  • Javascript对象及Proxy工作原理详解
    正文 这一章其实算是javascript的科普文章,其实这本书的读者一般都不会是入门者,因此按道理说应该不需要再科普才对。但是作者依旧安排了这一章,证明就是这一章内容与我们以为的对象...
    99+
    2022-11-13
    Javascript对象Proxy Javascript Proxy
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作