当前位置: 首页 > news >正文

react-fiber

参考

https://juejin.cn/post/7258071726227849277?searchId=20240704152643B8CDA80EA7A9A4A0DCA9#heading-26

https://juejin.cn/post/7182382408807743548?searchId=20240704152643B8CDA80EA7A9A4A0DCA9#heading-13

为什么会有fiber的概念

1、众所周知,react是有虚拟dom的概念的,如果新旧虚拟dom比对时间过长,占据着浏览器,这时候如果用户和页面进行交互会有卡顿的现象

2、这个时候就需要有个技术或者是个思想来解决这个问题,fiber就应运而生了

fiber是怎么工作的

大家都知道,页面是一帧一帧绘制出来的,当每秒绘制的帧数达到60时,页面是流畅的,小于这个值的时候是卡顿的,转换成时间就是16ms(1000/60)内执行的任务如果没有完成就会有卡顿

1、fiber是实现了一个基于优先级和requestIdleCallback(执行的前提条件是当前浏览器处于空闲状态) 的一个循环调度算法

2、fiber在渲染页面、diff阶段将任务拆分成多个小任务,这些小任务是分优先级的,并且可中断

3、执行的过程就是,每处理完一个任务单元,若还有足够的时间就继续做下一个小任务,没有就把时间交还给浏览器

4、不同任务的执行时间按照其优先级来,优先级高的先执行

  • Immediate: 最高优先级, 会马上执行的不能中断
  • UserBlocking: 这一般是用户交互的结果, 需要及时反馈
  • Normal: 普通等级的, 比如网络请求等不需要用户立即感受到变化的
  • Low: 低优先级的, 这种任务可以延后, 但最后始终是要执行的
  • Idle: 最低等级的任务, 可以被无限延迟的, 比如 console.log()

Fiber是纤程,比线程更精细,表示对渲染线程实现更精细的控制

应用目的
实现增量渲染,增量渲染指的是把一个渲染任务分解为多个渲染任务,而后将其分散到多个帧里。增量渲染是为了实现任务的可中断、可恢复,并按优先级处理任务,从而达到更顺滑的用户体验

Fiber的可中断、可恢复怎么实现的

fiber是协程,是比线程更小的单元,可以被人为中断和恢复,当react更新时间超过1帧时,会产生视觉卡顿的效果,因此我们可以通过fiber把浏览器渲染过程分段执行,每执行一会就让出主线程控制权,执行优先级更高的任务

fiber是一个链表结构,它有三个指针,分别记录了当前节点的下一个兄弟节点,子节点,父节点。当遍历中断时,它是可以恢复的,只需要保留当前节点的索引,就能根据索引找到对应的节点

带来的影响

由于 Fiber 采用了全新的调度方式, 任务的更新过程可能会被打断, 这意味着在组件更新过程中, render及其下面几个生命周期函数可能会被调用多次, 所以这几个生命周期函数中不应出现副作用:

同时考虑到 componentWillMount componentWillReceiveProps componentWillUpdate 这几个生命周期经常被误用, 所以干脆就废弃了, 同时新增了几个生命周期用于替代(这里具体可参考上文中, 生命周期部分)。

  • shouldComponentUpdate
  • componentWillMount(UNSAFE_componentWillMount)
  • componentWillReceiveProps(UNSAFE_componentWillReceiveProps)
  • componentWillUpdate(UNSAFE_componentWillUpdate)

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • C#运算符重载
  • flutter开发实战-Webview及dispose关闭背景音
  • c与c++ 常用的字符与字符串处理的接口介绍:
  • Xilinx FPGA:vivado关于fifo的一些零碎知识
  • 【K8s】【问题排查】k8s只能本地服务器访问服务,其他节点无法访问服务
  • crontab定时任务不执行原因排查
  • 国际网课平台Udemy上的亚马逊云科技AWS免费高分课程和创建、维护EC2动手实践
  • linux高级编程(TCP)(传输控制协议)
  • Java核心技术【二十】Java泛型的基本概念和原理详解
  • 二叉树超详细解析
  • phpstudy框架,window平台,如何开端口给局域网访问?
  • AIGC专栏12——EasyAnimateV3发布详解 支持图文生视频 最大支持960x960x144帧视频生成
  • 【QT中实现摄像头播放、以及视频录制】
  • Consul与CoreDNS的对比
  • 架构设计(2)云原生架构与实例部署
  • php的引用
  • 【编码】-360实习笔试编程题(二)-2016.03.29
  • Angular Elements 及其运作原理
  • jdbc就是这么简单
  • node和express搭建代理服务器(源码)
  • spark本地环境的搭建到运行第一个spark程序
  • SQLServer之索引简介
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • webgl (原生)基础入门指南【一】
  • 仿天猫超市收藏抛物线动画工具库
  • 离散点最小(凸)包围边界查找
  • 聊聊flink的BlobWriter
  • 前嗅ForeSpider采集配置界面介绍
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 一个完整Java Web项目背后的密码
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • 主流的CSS水平和垂直居中技术大全
  • 追踪解析 FutureTask 源码
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • ​3ds Max插件CG MAGIC图形板块为您提升线条效率!
  • ​Python 3 新特性:类型注解
  • ​如何使用QGIS制作三维建筑
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • (13):Silverlight 2 数据与通信之WebRequest
  • (4)(4.6) Triducer
  • (C++哈希表01)
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (vue)el-cascader级联选择器按勾选的顺序传值,摆脱层级约束
  • (不用互三)AI绘画工具应该如何选择
  • (过滤器)Filter和(监听器)listener
  • (已解决)什么是vue导航守卫
  • (转)创业的注意事项
  • .NET Core MongoDB数据仓储和工作单元模式封装
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • .net MVC中使用angularJs刷新页面数据列表
  • .pyc文件是什么?
  • [ C++ ] STL---string类的模拟实现
  • [ 渗透测试面试篇 ] 渗透测试面试题大集合(详解)(十)RCE (远程代码/命令执行漏洞)相关面试题
  • [ 英语 ] 马斯克抱水槽“入主”推特总部中那句 Let that sink in 到底是什么梗?
  • [Android Pro] AndroidX重构和映射