React Fiber架构

news2024/11/29 1:44:11

说到Fiber,不得不说说他的发展史:

React15 架构

  • React16之前的版本比对更新虚拟DOM的过程是采用循环递归方式来实现的,这种比对方式有一个问题,就是一旦任务开始进行就无法中断如果应用中数组数量庞大,主线程被长期占用,直到整颗虚拟DOM树比对更新完成之后主线程才被释放,主线程才能执行其他任务,这就会导致一些用户交互或动画等任务无法立即得到执行,页面就会产生卡顿,非常的影响用户体验。

  • 主要原因就是递归无法中断执行重的任务耗时较长,javascript又是单线程的无法同时执行其他任务,导致任务延迟页面卡顿用户体验差

    React15架构可以分为两层

    Reconciler(协调器)—— 负责找出变化的组件 Renderer(渲染器)—— 负责将变化的组件渲染到页面

    每当有更新发生时,Reconciler会做如下工作:

    • 调用函数组件、或class组件的render方法,将返回的JSX转化为虚拟DOM
    • 虚拟DOM和上次更新时的虚拟DOM对比
    • 通过对比找出本次更新中变化的虚拟DOM
    • 通知Renderer将变化的虚拟DOM渲染到页面上

    React15使用的是栈调和器,由于递归执行,所以更新一旦开始,中途就无法中断,当调用层级很深时,递归更新时间超过了屏幕刷新时间间隔,用户交互就会卡顿。

react 16架构

React16架构可以分为三层:

  • Scheduler(调度器)—— 调度任务的优先级,高优任务优先进入Reconciler

  • Reconciler(协调器)—— 负责找出变化的组件

  • Renderer(渲染器)—— 负责将变化的组件渲染到页面上

    相比React15,16增加了一个Scheduler(调度器)

    并发&调度(Concurrency & Scheduler)

  • Concurrency 并发: 有能力优先处理更高优事务,同时对正在执行的中途任务可暂存,待高优完成后,再去执行

  • Scheduler 协调调度: 在浏览器每一帧的时间中,预留一些时间给JS线程,React利用这部分时间更新组件,当预留的时间不够用时,React将线程控制权交还给浏览器使其有时间渲染UI,React则等待下一帧时间到来,继续被中断的工作
    在这里插入图片描述

    在源码中,预留的初始时间是5ms

    考虑到可中断渲染,并可重回构造。React自行实现了一套体系叫做 React fiber 架构。

    Scheduler 运行核心点

    • 有个任务队列 queue,该队列存放可中断的任务。

    • workLoop对队列里取第一个任务currentTask,进入循环开始执行。

    • 当该任务没有时间 或 需要中断 (渲染任务 或 其他高优任务插入等),则让出主线程。

    • requestAnimationFrame 计算一帧的空余时间;

    • 使用new MessageChannel ()执行宏任务;

      Fiber架构

      • 界面通过 vdom 描述,但是不是直接手写 vdom,而是 jsx 编译产生的 render function 之后以后生成的。这样就可以加上 state、props 和一些动态逻辑,动态产生 vdom

      • vdom 生成之后不再是直接渲染,而是先转成 fiber,这个 vdom 转 fiber 的过程叫做 reconcile

      • fiber一个链表结构可以打断,这样就可以通过 requestIdleCallback 来空闲调度 reconcile,这样不断的循环,直到处理完所有的 vdom 转 fiber 的 reconcile,就开始 commit,也就是更新到 dom

      • reconcile 的过程会提前创建好 dom,还会标记出增删改,那么 commit 阶段就很快了。

      • 从之前递归渲染时做 diff 来确定增删改以及创建 dom,提前到了可打断的 reconcile 阶段,让 commit 变得非常快,这就是 fiber 架构的目的和意义。

      Fiber的数据结构有三层信息: (采用链表结构)

    • 实例属性
      Fiber的基本信息,例如组件类型等。

    • 构建属性
      构建属性 (return、child、sibling)

    • 工作属性

      • 数据的变更会导致UI层的变更

      • 为了减少对DOM的直接操作,通过Reconcile进行diff查找,并将需要变更节点,打上标签,变更路径保留在effectList里

      • 待变更内容要有Scheduler优先级处理涉及到diff等查找操作,是需要有个高效手段来处理前后变化,即双缓存机制

      • 链表结构即可支持随时随时中断的诉求

      schedule 就是通过空闲调度每个 fiber节点的reconcile(vdom转fiber),全部reconcile完了就执行commit

      React Fiber 核心: 自行实现 虚拟栈帧

      总结

      • React16 使用的是全新的"Fiber调和器",这就依托于React16的重点了—Fiber架构。
      • React16能够实现中断调和分批次异步地调和。从而达到不因为JS执行时间过久影响浏览器渲染

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

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

相关文章

红黑树及插入过程详解

推荐可视化插入、删除节点的二叉树网站:Red/Black Tree Visualization (usfca.edu) 1. 概述 红黑树(Red-Black Tree)是一种自平衡的二叉搜索树(Binary Search Tree)。它在普通二叉搜索树的基础上通过引入额外的颜色属…

DragGAN图像生成原理与实现

DragGAN图像生成原理与实现 DragGAN模型是什么呢1. DragGAN背景介绍2. 模型方法2.1 算法原理2.1.1 Motion Supervision2.1.2 点跟踪 3. 实现部署步骤3.1 安装PyTorch3.2 安装 DragGAN3.3 运行 DragGAN Demo3.4 功能介绍 项目地址:https://github.com/Zeqiang-Lai/Dr…

衡量有效的质量保证过程的10个基本指标

作者 | Tania Zhydkova 在开发的世界中,有一个永恒的规则,那就是你无法改进无法衡量的东西。当然,这条规则也适用于质量保证。 所生产软件的阵列呈指数级增长,这意味着保证质量所需的测试覆盖率也在以同样的程度增长。这也导致了…

浅谈Web渗透测试

目录 背景介绍 漏洞挖掘 渗透测试 个人看法 Web 渗透测试方法构想 PTES 简介 Web “PTES” 前期交互 信息收集 漏洞建模 漏洞分析 渗透利用 测试报告 Web渗透测试实例 前期交互 信息收集 漏洞建模 漏洞分析 渗透利用 报告 本文包括 背景介绍,We…

上传作品并投票的小程序微信中的微信投票微信小程序

现在来说,公司、企业、学校更多的想借助短视频推广自己。 通过微信投票小程序,网友们就可以通过手机拍视频上传视频参加活动,而短视频微信投票评选活动既可以给用户发挥的空间激发参与的热情,又可以让商家和企业实现推广的目的&am…

IDEA 创建 Springmvc 项目

一、概述 在18年的时候就开始接触 SpringBoot ,然后就一直在使用它。众所周知 SpringBoot 内嵌 Tomcat,后续再也没有单独新建过Web 项目。作为IDEA 的用户,总想要用它来建一个Web 项目自己跑一跑,但建项目不是我最终目的~~ &…

为什么那么多人劝退软件测试?月薪1万以上的就别点进来了

2023年已经过了快一半了,今天跟大家聊一聊软件测试薪资这个话题 和大家说一句掏心窝的话:直到现在,软件测试依旧是寒门改变命运的一个最佳选择之一,要不是怕被喷,我都想把之一去掉,因为想了半天&#xff0…

【Bert、T5、GPT】fine tune transformers 文本分类/情感分析

【Bert、T5、GPT】fine tune transformers 文本分类/情感分析 0、前言text classificationemotions 数据集data visualization analysisdataset to dataframelabel analysistext length analysis text > tokenstokenize the whole dataset fine-tune transformersdistilbert…

Python-GEE遥感云大数据分析、管理与可视化技术及多领域案例应用

随着航空、航天、近地空间等多个遥感平台的不断发展,近年来遥感技术突飞猛进。由此,遥感数据的空间、时间、光谱分辨率不断提高,数据量也大幅增长,使其越来越具有大数据特征。对于相关研究而言,遥感大数据的出现为其提…

uni-app生命周期有哪些?怎么理解?

uni-app生命周期有哪些?怎么理解? uni-app生命周期有哪些?怎么理解? 文章目录 uni-app生命周期有哪些?怎么理解?前言一、什么是生命周期函数?二、uni-app生命周期分类总结 前言 UNI-APP学习系…

Spring概述、Spring的优势和体系结构

Spring是什么 Spring是分层的 Java SE/EE应用 full-stack 轻量级开源框架,以 IoC(Inverse Of Control:反转控制)和 AOP(Aspect Oriented Programming:面向切面编程)为内核。提供了展现层 Sprin…

【重磅】“饶派杯”XCTF车联网安全挑战赛明日开赛!

2023年5月31日,由江西省委网信办、江西省工信厅、上饶市人民政府主办的“饶派杯”XCTF车联网安全挑战赛即将重磅开赛。来自国内外知名高校、自动驾驶汽车企业和科研院所的21支CTF精英战队齐聚上饶,聚焦车联网安全行业的典型漏洞及风险,面向车…

借助chatgpt做一个pdf转word的小工具

因 中午我在一篇公众号文章中发现了一个名为 pdf2docx 的 Python 包,可以将 PDF 文件转换成 Word 文件。但是,这个包不支持将图片型 PDF 转换成 Word,而且需要自己编写代码来实现转换功能。 于是我想,将这个包制作成一个小工具&a…

企业仓库管理系统的设计与实现(ASP.NET,SQL)

开发环境:Microsoft Visual Studio 数据库:Microsoft SQL Server 程序语言:asp.NET(C#)语言 本系统的开发使各大公司所的项目管理更加方便快捷,同时也促使项目的管理变的更加系统化、有序化。系统界面较友好,易于操作。…

食物储藏信息管理系统的设计与实现(ASP.NET,SQLServer)

需求分析 食物储藏信息管理系统是一个典型的数据库开发应用程序,由基础信息维护、用户信息维护、食物提醒管理、用户管理、食物管理、系统管理、食物储藏等功能模块组成。 具体功能实现如下: 食物管理:食物管理部门自行添加食物,可…

华为OD机试真题B卷 Java 实现【24点游戏算法】,附详细解题思路

一、题目描述 给出4个1-10的数字,通过加减乘除运算,得到数字为24就算胜利,除法指实数除法运算,运算符仅允许出现在两个数字之间,本题对数字选取顺序无要求,但每个数字仅允许使用一次,且需考虑括号运算 此题允许数字重复&#xff…

Ubuntu22.04部署K8S1.27.2版本集群

一、设置主机名并在 hosts 文件中添加条目 1、登录节点使用 hostnamectl 命令设置 hostname #在master中: 172.18.10.11 $ sudo hostnamectl set-hostname "k8s-master" #在work1节点中: 172.18.10.12 $ sudo hostnamectl set-host…

“百亿生态”背后,拼多多的初心

哈佛商学院教授、“颠覆性创新”理论的提出者克莱顿克里斯坦森,在《繁荣悖论》中将创新分为三类:第一类是效率创新,即生产更便宜、更优质的产品;第二类是持续性创新,即不断对产品进行改进;第三类是市场创造…

cuda编程学习——卷积计算CUDA、Pytorch比较 干货向(六)

前言 参考资料: 高升博客 《CUDA C编程权威指南》 以及 CUDA官方文档 CUDA编程:基础与实践 樊哲勇 参考B站:蒙特卡洛加的树 文章所有代码可在我的GitHub获得,后续会慢慢更新 文章、讲解视频同步更新公众《AI知识物语》&#…