react 对Fiber架构的理解?解决了什么问题?

一、问题

JavaScript 引擎和页面渲染引擎两个线程是互斥的,当其中一个线程执行时,另一个线程只能挂起等待

如果 JavaScript 线程长时间地占用了主线程,那么渲染层面的更新就不得不长时间地等待,界面长时间不更新,会导致页面响应度变差,用户可能会感觉到卡顿

而这也正是 React 15 的 Stack Reconciler 所面临的问题,当 React 在渲染组件时,从开始到渲染完成整个过程是一气呵成的,无法中断

如果组件较大,那么js线程会一直执行,然后等到整棵VDOM树计算完成后,才会交给渲染的线程

这就会导致一些用户交互、动画等任务无法立即得到处理,导致卡顿的情况。

二、是什么

React Fiber 是 Facebook 花费两年余时间对 React 做出的一个重大改变与优化,是对 React 核心算法的一次重新实现。从Facebook在 React Conf 2017 会议上确认,React Fiber 在React 16 版本发布

react中,主要做了以下的操作:

  • 为每个增加了优先级,优先级高的任务可以中断低优先级的任务。然后再重新,注意是重新执行优先级低的任务
  • 增加了异步任务,调用requestIdleCallback api,浏览器空闲的时候执行
  • dom diff树变成了链表,一个dom对应两个fiber(一个链表),对应两个队列,这都是为找到被中断的任务,重新执行

从架构角度来看,Fiber 是对 React 核心算法(即调和过程)的重写

从编码角度来看,Fiber 是 React 内部所定义的一种数据结构,它是 Fiber 树结构的节点单位,也就是 React 16 新架构下的虚拟DOM

一个 fiber 就是一个 JavaScript 对象,包含了元素的信息、该元素的更新操作队列、类型,其数据结构如下:

type Fiber = {// 用于标记fiber的WorkTag类型,主要表示当前fiber代表的组件类型如FunctionComponent、ClassComponent等tag: WorkTag,// ReactElement里面的keykey: null | string,// ReactElement.type,调用`createElement`的第一个参数elementType: any,// The resolved function/class/ associated with this fiber.// 表示当前代表的节点类型type: any,// 表示当前FiberNode对应的element组件实例stateNode: any,// 指向他在Fiber节点树中的`parent`,用来在处理完这个节点之后向上返回return: Fiber | null,// 指向自己的第一个子节点child: Fiber | null,// 指向自己的兄弟结构,兄弟节点的return指向同一个父节点sibling: Fiber | null,index: number,ref: null | (((handle: mixed) => void) & { _stringRef: ?string }) | RefObject,// 当前处理过程中的组件props对象pendingProps: any,// 上一次渲染完成之后的propsmemoizedProps: any,// 该Fiber对应的组件产生的Update会存放在这个队列里面updateQueue: UpdateQueue<any> | null,// 上一次渲染的时候的statememoizedState: any,// 一个列表,存放这个Fiber依赖的contextfirstContextDependency: ContextDependency<mixed> | null,mode: TypeOfMode,// Effect// 用来记录Side EffecteffectTag: SideEffectTag,// 单链表用来快速查找下一个side effectnextEffect: Fiber | null,// 子树中第一个side effectfirstEffect: Fiber | null,// 子树中最后一个side effectlastEffect: Fiber | null,// 代表任务在未来的哪个时间点应该被完成,之后版本改名为 lanesexpirationTime: ExpirationTime,// 快速确定子树中是否有不在等待的变化childExpirationTime: ExpirationTime,// fiber的版本池,即记录fiber更新过程,便于恢复alternate: Fiber | null,
}

三、如何解决

Fiber把渲染更新过程拆分成多个子任务,每次只做一小部分,做完看是否还有剩余时间,如果有继续下一个任务;如果没有,挂起当前任务,将时间控制权交给主线程,等主线程不忙的时候在继续执行

即可以中断与恢复,恢复后也可以复用之前的中间状态,并给不同的任务赋予不同的优先级,其中每个任务更新单元为 React Element 对应的 Fiber 节点

window.requestIdleCallback()方法将在浏览器的空闲时段内调用的函数排队。这使开发者能够在主事件循环上执行后台和低优先级工作,而不会影响延迟关键事件,如动画和输入响应

首先 React 中任务切割为多个步骤,分批完成。在完成一部分任务之后,将控制权交回给浏览器,让浏览器有时间再进行页面的渲染。等浏览器忙完之后有剩余时间,再继续之前 React 未完成的任务,是一种合作式调度。

作为动态的工作单元来说,每个 Fiber 节点保存了本次更新中该组件改变的状态、要执行的工作。

每个 Fiber 节点有个对应的 React element,多个 Fiber 节点根据如下三个属性构建一颗树:

// 指向父级Fiber节点
this.return = null
// 指向子Fiber节点
this.child = null
// 指向右边第一个兄弟Fiber节点
this.sibling = null

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/745862.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Gis导航控件

收费工具&#xff0c;白嫖党、学生党、闹眼子党勿扰 收费金额为100元 1 概述 最近研究了一下电子海图相关内容&#xff0c;发现海图解析和显示相关的功能&#xff0c;都没有好用的开源工具… 在Gis地图显示那一块&#xff0c;有一个导航控件小控件&#xff0c;好像还没有人专门…

从前端到前端框架

原文地址&#xff1a;从前端到前端框架 - Pleasure的博客 下面是正文内容&#xff1a; 前言 这是一篇笔记&#xff0c;主要用于帮助刚入门Web全栈不久的同学。以及个人思路的记录整理。 如果你是一个全栈大师就可以直接跳过了。当然想加深一下理解也没有问题。 可能会较多谈谈…

《父母的觉醒》父母不是在培养一个“迷你版”的自己

简介 作者为美国哥伦比亚大学心理学博士沙法丽萨巴瑞。作者也写了《家庭的觉醒》。 作者的核心观点&#xff1a; 我们必须认识到&#xff0c;我们不是在培养一个“迷你版”的自己&#xff0c;而是在塑造一个具有独立特征的灵魂。正因为如此&#xff0c;我们必须铆足精神&#…

IDEA把中国大陆高校教育邮箱都封了?

今天本想趁着快到期前&#xff0c;用教育邮箱续命&#xff0c;没想到&#xff1a; 天不遂人愿&#xff01;只能继续申请开源项目的许可证&#xff01; 可惜了&#xff0c;没提交在每个月&#xff1a;

Linux命令-date命令(显示或设置系统时间与日期)

概要 date [OPTION]... [FORMAT] date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]主要用途 转换时间到选定的格式&#xff0c;默认为当前。设置系统时间。 参数 format&#xff1a;输出的时间格式。 format可用的转义序列如下&#xff1a;%% 百分号 %a 当地缩写的工…

Rockchip 有时遥控器ok键按下后不是确认功能,而是跳转下一个

问题平台描述 问题描述解决方法 郑重声明:本人原创博文&#xff0c;都是实战&#xff0c;均经过实际项目验证出货的 转载请标明出处:攻城狮2015 Platform: Rockchip OS:Android 10.1 Kernel: 4.19 问题描述 目前市面上的Allwinner amlogic rockchip在使用外接usb遥控器&#xf…

汇编语言程序设计 第3章:汇编语言程序格式

文章目录 1. 伪指令1.1 段定义伪指令1.2 段寄存器说明伪指令1.3 过程定义伪指令1.4 源程序结束伪指令 2. 变量/标号定义伪指令2.1 变量定义2. 2 标号定义2.3 表达式 3.地址计数器与对准伪指令3.1 地址计数器$3.2 对准伪指令 4. DOS功能调用4.1 DOS功能调用的一般方法4.2 常用的…

Git详细入门笔记

主要分为两个 一个是可视化软件&#xff0c;一个就是鼠标右键选择Git Bash 一、可视化软件 1、文件操作 点击file选项&#xff0c;可以选择添加clone&#xff0c;也可以add或者new new完文件之后&#xff0c;可以点击图形界面中的show in explorer&#xff0c;直接进入文件夹…

python垃圾回收机制

Python中的垃圾回收机制是自动的&#xff0c;它主要使用了引用计数来追踪和回收内存。 1、引用计数 当一个对象被创建时&#xff0c;就会被分配一块内存&#xff0c;然后将其引用计数设置为1。当另一个变量引用该对象时&#xff0c;引用计数就会增加1。当一个对象的引用计数变…

《数据结构》复试问答题总结

请简述深度优先遍历、广度优先遍历的基本思想&#xff1f;&#xff1a; 深度遍历是在图中先选择一个顶点&#xff0c;随后的每次遍历中选择与顶点相邻并且还没有遍历过的结点进行遍历&#xff0c;类似于树的先序遍历 广度遍历是先在图中选择一个顶点&#xff0c;并加入队列中&a…

基于亚马逊云EC2+Docker搭建nextcloud私有化云盘

亚马逊云科技EC2云服务器&#xff08;Elastic Compute Cloud&#xff09;是亚马逊云科技AWS&#xff08;Amazon Web Services&#xff09;提供的一种云计算服务。EC2代表弹性计算云&#xff0c;它允许用户租用虚拟计算资源&#xff0c;包括CPU、内存、存储和网络带宽&#xff0…

ES解析word内容为空的问题和直接使用Tika解析文档的方案

导言 在上一篇文章最后&#xff0c;我们虽然跑通了ES文件搜索的全部流程&#xff0c;但是仍然出现了1个大的问题&#xff1a;ES7.3实测无法索引docx和doc文档&#xff0c;content有值但是无法解析到附件成为可读的可搜索的内容&#xff0c;附件内容为空&#xff08;附件中根本…

Sqlserver 模糊查询中文及在mybatis xml【非中文不匹配查询】N@P2问题

问题 sqlserver模糊查询或相等&#xff0c;两者都无法查询。 百度方案解释 Like 后的N是表示unicode字符。获取SQL Server数据库中Unicode类型的数据时&#xff0c;字符串常量必须以大写字母 N 开头&#xff0c;否则字符串将转换为数据库的默认代码页(字符集编码)&#xff0…

【源码独家】充电桩平台(四轮电动汽车 微服务 云快充协议)

文章目录 一、产品功能部分截图1.手机端&#xff08;小程序、安卓、ios&#xff09;2.PC端 二、小程序体验账号以及PC后台体验账号1.小程序体验账号2.PC后台体验账号关注公众号获取最新资讯 三、产品简介&#xff1f;1. 充电桩云平台&#xff08;含硬件充电桩&#xff09;&…

守护健康,从营养开始 —— 帕金森患者的饮食秘籍

亲爱的读者朋友们&#xff0c;您是否知道&#xff0c;在对抗帕金森病的道路上&#xff0c;正确的饮食和营养补充可以成为我们的有力盟友&#xff1f;今天&#xff0c;就让我们一起探索那些能够帮助帕金森患者改善症状、提高生活质量的营养素&#xff0c;开启健康生活的新篇章。…

Python数据分析-Numpy2

1.numpy读取数据 CSV:Comma-SeparatedValue,逗号分隔值文件 显示&#xff1a;表格状态 源文件&#xff1a;换行和逗号分隔行列的格式化文本,每一行的数据表示一条记录 由于csv便于展示,读取和写入,所以很多地方也是用csv的格式存储和传输中小型的数据,为了方便教学,我们会经…

PyTorch基础学习系列、深度学习基础模块、调优合集

整理了一下之前写的深度学习基础知识文章&#xff0c;方便浏览&#xff01; 1. pytorch基础学习系列文章&#xff0c;里面代码和示例 《PyTorch深度学习实践》05 用PyTorch实现线性回归 《PyTorch深度学习实践》06 用PyTorch实现Logistic回归 《PyTorch深度学习实践》07加载数…

mysql 主从延迟分析

一、如何分析主从延迟 分析主从延迟一般会采集以下三类信息。 从库服务器的负载情况 为什么要首先查看服务器的负载情况呢&#xff1f;因为软件层面的所有操作都需要系统资源来支撑。 常见的系统资源有四类&#xff1a;CPU、内存、IO、网络。对于主从延迟&#xff0c;一般会…

2024-3-13,14(CSS)

1.复合选择器 有两个或者多个基础选择器&#xff0c;通过不同的方式组合而成。 目的是更加准确高效的选择目标元素&#xff08;标签&#xff09; 分类&#xff1a; 后代选择器&#xff1a;选中某个元素的所有后代元素 写法&#xff1a;父选择器 子选择器 {CSS属性}&#x…

软件授权在机器视觉行业的六大创新应用

智能制造已经离不开软件&#xff0c;软件打造高效低成本的制造是趋势&#xff0c;本文介绍通过软件授权赋能机器视觉实现更多在智能制造中的创新功能应用。 机器视觉应用软件在智能制造中呈现的六大创新应用趋势&#xff1a; 一、机器视觉&#xff1a;软件投入占比越来越高 通过…