react 之 fiber 架构

news/2024/12/21 20:05:19/文章来源:https://www.cnblogs.com/xxflz/p/18447732

一、为什么要用 fiber架构

 在react16 之前,react是用 diff 算法对vitrulDom进行对比更新渲染,这种 diff 算法对比 如果遇到需要大量时间执行的方法任务时,就会造成页面卡顿

二、什么是 fiber 架构

 fiber架构简单点说就是 任务切片(一个耗时任务在浏览器空闲时,分多次执行),这样就在用户感官上页面流畅不卡顿

浏览器卡顿判断标准:

 正常情况下人眼感受到的 每秒 60帧,也就是16.6ms/帧,如果超过超过这个值,就会感受到卡顿,如果说某个任务耗时超过16.6ms就会造成页面暂时卡顿

fiber怎么做:

  fiber 架构会把一个要耗时任务会分解成无数个执行只需大概5ms的任务片段,在浏览器空闲时执行

如何判断浏览器是否空闲:

  浏览器有个API叫  requestIdleCallback 

 requestIdleCallback回调函数: 回调函数是在主线程空闲时被调用的函数。每次调用时,都会传入一个IdleDeadline对象,该对象提供一个timeRemaining()方     法,用来检测当前帧中剩余的空闲时间。

注意:requestIdleCallback 是一个宏任务,在事件列表中是最后执行的

but!!!react 并没有使用浏览器原生的 requestIdleCallback 方法(因为浏览器兼容,目前只要chorm支持)

react 而是用了  MessageChannel 进行任务调度

什么是 MessageChannel?

MessageChanne设计初衷是为了方便 我们在不同的上下文之间进行通讯,例如web Worker,iframe
它提供了两个端口(port1 和 port2),通过这些端口,消息可以在两个独立的线程之间双向传递

 

const channel = new MessageChannel();
const port1 = channel.port1;
const port2 = channel.port2;// 设置 port1 的消息处理函数
port1.onmessage = (event) => {console.log('Received by port1:', event.data);port1.postMessage('Reply from port1'); // 向 port2 发送回复消息
};// 设置 port2 的消息处理函数
port2.onmessage = (event) => {console.log('Received by port2:', event.data);
};// 通过 port2 发送消息给 port1
port2.postMessage('Message from port2');

 

 

react 是实现是复杂的,他要设计任务执行优先级(优先级设计包含过期时间、是否用户操作、组件优先级等)

 

三、fiber 如何中断任务

 fiber 分片任务执行的两个阶段:

1、调度:任务中断可以在调度阶段进行

2、提交:提交阶段任务不能中断

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

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

相关文章

c盘清理指南

1.清理缓存文件 快捷键Win+R输入%temp%2.磁盘清理直接win键+搜索磁盘清理3.休眠文件关闭关机时下次开机powercfg -h off 有需要休眠文件的时候再powercfg -h on 4.临时文件 设置→系统→存储→临时文件,删除! 5.把ubuntu从c移到d出现0x80073cf6错误代码 https://www.yundongf…

轻松找到并查看织梦CMS的数据库配置文件,从而获取数据库连接信息

使用FTP工具连接到服务器。 导航到 /var/www/html/include 目录。 打开 config.inc.php 文件。使用SSH连接到服务器。 切换到相应目录:bashcd /var/www/html/include使用文本编辑器打开文件:bashvi config.inc.php通过以上步骤,你可以轻松找到并查看织梦CMS的数据库配置文件…

使用ValueConverters扩展实现枚举控制页面的显示

1、ValueConverters 本库包含了IValueConverter接口的的最常用的实现,ValueConverters用于从视图到视图模型的值得转换,某些情况下,可用进行反向转换。里面有一些抽象类、模板类的定义,可以继承这些类实现一些自己想要实现的功能,方便快速。像BoolToValueConverterBase、V…

【Shiro】3.Springboot实现缓存

最近已经快速入门了Shiro。对于登录、授权、认证等方法,每次都是从数据库直接查询。如果登录的人员过多,对数据库来说,是一项压力。如何减轻数据库的压力。EhCache 实现缓存 集成 Redis 实现 Shiro 缓存(推荐使用)在此之前,我们已经简单学会EhCache 和Reids的使用。 EhCa…

织梦如何数据库备份,织梦cms网站数据怎么备份与还原

织梦CMS(DedeCMS)的数据库备份和还原是非常重要的操作,可以帮助你在出现问题时快速恢复数据。下面详细介绍如何进行织梦CMS的数据库备份和还原。 一、数据库备份 1. 使用 phpMyAdmin 备份数据库登录 phpMyAdmin登录到你的网站控制面板(如 cPanel)。 找到并打开 phpMyAdmin…

【软考】3 校验码

校验码 码距概念:任意进制的两个码值之间的最小二进制位数称为校验码的码距 例如:二进制1bit位,从0到1,则码距是1,二进制2bit位 从 00 到 11 一共4个码字,但码距还是为1 可以设置 性别男为 00 女为 11两个合法码字,则该两个合法码字的最小码距为2 (间隔 01 和 10 两个)…

IOU指标

IOU:全称 intersection over union 交并比,两个区域真实框和预测框之间的交集比他们之间的总面积-交集的 IOU指标:通常用于评估计算机视觉任务中的模型性能,特别是目标检测和图像分割。一个较高的IoU值意味着模型的定位和分割精度更好。

Redis安装管理, RDB, AOF ubuntu使用

1.1 Redis 基础redis单线程处理用户请求,不用加锁。其他线程做别的工作1.2 Redis 安装 Ubuntu 安装 Redis 范例:基于官方仓库包安装 (可以安装最新版本)#官方地址 https://redis.io/docs/install/install-redis/install-redis-on-linux/#导入key [root@ubuntu2204 ~]#curl -f…

查找和管理数据库的具体步骤

登录MySQL命令行使用SSH连接到服务器。 登录MySQL命令行:bashmysql -u root -p输入MySQL root用户的密码。查看数据库列表在MySQL命令行中查看所有数据库:sqlSHOW DATABASES;选择织梦CMS数据库选择织梦CMS使用的数据库:sqlUSE dedecmsv56gbk;查看数据库表查看织梦CMS数据库中…

DedeCMS Error Track:DedeCMS错误警告:连接数据库失败

当织梦CMS(DedeCMS)出现“连接数据库失败”的错误时,可以通过以下几个步骤进行排查和解决: 1. 检查数据库配置文件打开配置文件打开织梦CMS的数据库配置文件 include/config.inc.php。 使用FTP工具或SSH连接到服务器,然后打开该文件。检查配置信息确认数据库配置信息是否正…

SpringMVC内容

SpringMVC简介 SpringMVC(Model View Controller) 是以Servlet API为基础的 Web 框架并可以部署到 Servlet容器(比如:Tomcat),是控制层框架,主要负责与前端交互,接收前端的参数,在服务层进行交互,并把结果返回会前端页面。 SpringMVC工作原理当发送请求的时候,Dis…

Linux系统安装Pycharm专业版【附破解方法】

​写在前面 本教程适用于 Pycharm 2022.2.3 以下所有版本 一、版本信息 虚拟机产品:VMware Workstation 17 Pro 虚拟机版本:17.0.0 build-20800274 ISO映像文件:ubuntukylin-22.04-pro-amd64.iso Pycharm版本:PyCharm 2022.3.3 (Professional Edition) 资源链接:https:/…