react理念(一)

news2024/10/13 0:34:55

react

react理念

当遇到大计算量的操作或者设备性能不足的页面掉帧,会导致卡顿,发送网路请求的时候,需要等待数据返回才能进一步操作导致不能快速响应。叫做cpu的瓶颈和io的瓶颈

cpu的瓶颈

主流浏览器刷新频率为60hz(requestAnimation), js可以操作dom,gui渲染线程和js线程是互斥的,js脚本执行和浏览器布局,绘制不能同时执行。
所以在一个hz的刷新过程中,需要完成脚本执行,样式布局,样式绘制。当js执行时间过长,刷星就没有时间执行样式布局和样式绘制了。js脚本执行时间过长,页面掉帧,造成卡顿。react解决的思路是,在浏览器的每一帧中,预留一些时间给js线程,react利用这部分时间来更新组件。当预留的时间不足的时候,react将线程控制权交还给浏览器让他有时间来渲染ui,react等待下一帧时间来继续被中断的工作。
Concurrent Mode(并发模式),开启并发模式后,长任务会被拆分到不同的task中。这样浏览器就会有时间执行样式布局和绘制。减少掉帧的可能性。解决cpu瓶颈的关键是时间切片,时间切片的关键是将同步的更行变化为中断的一部更新。

io的瓶颈

网络延迟是客观存在的,现在当前页面停留一段时间,这段时间被用来请求数据,当这段时间足够段的时候,用户是没有感知的。react实现了这些功能以及配套的hook。实现这种功能,需要将同步的更新转换为可中断的异步更新。

react15

react15架构包含两层,协调器找出变化的组件,渲染器将变化的组件渲染到页面上。

协调器
  • 调用函数组件,或class组件的render方法,将返回的jsx转换为虚拟dom
  • 将虚拟dom和上次的虚拟dom来进行对比
  • 通过对比找出本次更新中变化的虚拟dom
  • 通知renderer将变化的虚拟dom渲染到页面上
渲染器

由于react支持跨平台,不同平台会有不同的renderer。浏览器环境渲染-reactdom。 reactnative渲染-渲染app原生组件。reacttest渲染-纯js对象用于测试。reactart渲染器-渲染到canvas,svg或者vml
每次更新发生的时候,渲染器接收到协调器的通知。

架构的缺点,mount和update都会递归更新组件,递归执行,更新一旦开始,中途无法中断,当层级很深的死后,递归更新超过了16ms,用户就会变得卡顿,可以使用中断的异步更新代理同步的更新。渲染器和协调器是交替工作的,整个过程是同步的,所以用户看来是同时更新的。当发生中断的时候,页面的渲染也会出现中断。

react16

react16分为三层。调度器,负责任务的优先级,高优任务优先进入协调器,协调器负责找出变化的组件,渲染器负责将变化的组件渲染到页面上。

调度器

以浏览器是否有剩余时间作为任务中断的标准,需要一种机制,当浏览器有剩余时间的时候进行通知。[requestIdleCallback=> 这个函数在浏览器空闲的时候被调用,开发者能够在主事件循环上执行后台和低优先级工作,如果回调函数指定了超时时间timeout,有可能为了在超时前执行函数而打乱执行顺序。可以在空闲回调函数中调用requestIdleCallback,以便在下次事件循环之前调度另一个回调]。由于兼容性和触发频率不稳定,等很多因素的影响,当浏览器切换到tab的时候,之前注册的requestIdleCallback触发的频率会变得很低。
所以react实现了功能更加完备的requestIdleCallback polyfill。在空闲时触发回调的功能外,还提供了多种调度优先级供任务设置。scheduler是独立于react的库

协调器

在react15中,是用来递归处理虚拟dom的
在react 16中, 更新工作从递归变成了可以中断的循环过程。每次循环都会调用shouldYield判断当前是否有剩余时间。
react16,协调器和渲染器不是交替工作的,当调度器将任务交给协调器之后,协调器就会为变化的虚拟dom打上增删改更新的标记,整个调度器和协调器的工作都在内存中进行,只有当组件完成协调器的工作,才会同意交给调度器。

渲染器

渲染器根据协调器打的标签,同步执行对应的dom操作
调度器和协调器的步骤,会被中断,中断原因(1. 更高优先级的任务需要优先更新,2. 当前帧没有剩余时间),因为是与平台无关的,所以react为他们单独发了一个包。

fiber

代数效应: 代数效应是函数式编程中的一个概念,将副作用从函数中分离出来,使用就是hooks
从react15到16,协调器重构,能够将同步更新的架构变成了异步可中断更新。
异步可中断更新:更新在执行过程中可能会被打断,浏览器时间分片用尽或者有更高优任务插队,当可以继续执行时回复之前执行的中间状态。
浏览器原生就支持类似的实现。就是generator。但是generator是类似于async的,可以传染,使用generator则上下文中的其他函数也需要作出改变,这样负担比较重。generator执行的中间状态是上下文关联的。
只考虑单一优先级任务的中断与继续的情况下generator可以很好的实现异步可同步更新。但是考虑到高优先级任务插队的情况,generator执行的中间状态是上下文关联的,所以无法进行复用之前的值,需要重新计算。
fiber叫做纤程,在js中,协程的实现是generator,可以将fiber和generator理解为代数效应在js中的体现。
react fiber可以理解为,react内部实现的一套状态更新机制,支持任务不同优先级,可以中断和回复,并且回复后可以服用之前的中间状态,每个任务更新单元就是react 元素对应的fiber节点。

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

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

相关文章

理解Web3的互操作性:不同区块链的连接

随着Web3的迅速发展,互操作性成为区块链技术中的一个核心概念。互操作性指的是不同区块链之间能够无缝地交流和共享数据,从而实现更加高效和灵活的生态系统。本文将探讨Web3中互操作性的意义、面临的挑战以及未来的发展趋势。 1. 互操作性的意义 在Web…

优达学城 Generative AI 课程3:Computer Vision and Generative AI

文章目录 1 官方课程内容自述第 1 课:图像生成简介第 2 课:计算机视觉基础第 3 课:图像生成与生成对抗网络(GANs)第 4 课:基于 Transformer 的计算机视觉模型第 5 课:扩散模型第 6 课&#xff0…

利用AI大模型,增强你的DevOps!

前言 自从去年春天ChatGPT问世之后,互联网也掀起了拥抱AI的浪潮,不仅是各大头部大厂相继发布大模型产品,在开发者的Coding过程中也紧跟时代,一些热门插件也纷纷受到了开发者的青睐,比如GitHub Copilot的智能代码生成。…

数据结构编程实践20讲(Python版)—05二叉树

本文目录 写在前面:大“树”下好乘凉定义主要术语基本特征主要应用领域:05 二叉树Binary treeS1 说明S2 示例S3 二叉树类型(1)满二叉树(Perfect Binary Tree)(2)完全二叉树(Complete Binary Tree)(3)二叉搜索树(Binary Search Tree)(4)平衡二叉树(Balanced Bin…

Windows环境NodeJS下载配置安装运行

Windows环境NodeJS下载配置安装运行 (1)下载 Node.js — Run JavaScript Everywhere 安装文件。 一路傻瓜式安装。 如果安装正常,输入命令可显示版本号: (2)可以查询nodejs默认的后续依赖安装包位置及缓存…

稻盛和夫认为,一个领导是否值得追随,看这几点就够了

一、真正的领导者有自信,但不自大,有坚定的信念和价值观。 稻盛和夫认为,领导者的真正强大之处在于他们能够坚定地做正确的事情。领导者必须具备勇气和决心,以及坚定的信念,以便在面对挑战和困难时能够坚持自己的信念…

Vert.x,Web - 静态资源/模板

静态资源 Vert.x-Web带有开箱即用的处理器(StaticHandler),用于处理静态Web资源(.html, .css, .js, …), 因此可以非常轻松地编写静态Web服务器。 默认静态文件目录为类路径下的webroot目录,对于maven的项目,按规范放在src/main/…

BIO与NIO学习

BIO:同步阻塞IO,客户端一个连接请求(socket)对应一个线程。阻塞体现在: 程序在执行I/O操作时会阻塞当前线程,直到I/O操作完成。在线程空闲的时候也无法释放用于别的服务只能等当前绑定的客户端的消息。 BIO的代码实现 …

郑光荣参加老年春节联欢晚会团长会议现场采访

郑光荣作为北京正明圣达叫卖团的业务团长,他不仅在多个春节联欢晚会中展现了 自己的才华,还在团长会议现场接受了采访。在2024年参加了多个电视台的 春节联欢晚会录制。 郑光荣曾经参与了包括北京广播电视台、海南卫视,中国国际教育电视台…

c++基础-去掉空格

#include <algorithm> #include <string> #include <cctype> // 用于std::isspace std::string removeSpaces(std::string str) {str.erase(std::remove_if(str.begin(), str.end(), ::isspace), str.end());return str; }int main() {string str &quo…

腾讯云视立方Flutter 相关

两台手机同时运行 Demo&#xff0c;为什么看不到彼此的画面&#xff1f; 请确保两台手机在运行 Demo 时使用的是不同的 UserID&#xff0c;TRTC 不支持同一个 UserID &#xff08;除非 SDKAppID 不同&#xff09;在两个终端同时使用。 防火墙有什么限制&#xff1f; 由于 SDK…

visual studio使用ssh连接linux虚拟机运行程序

1.vs安装linux组件 2.安装后新建项目 新建后会有一个使用指南 设置网络为桥接网卡后打开虚拟机 使用vs提升的那句话安装工具 sudo apt-get install openssh-server g gdb gdbserver 重启ssh服务 sudo service ssh restart 接着进去打开ssh端口 sudo vi /etc/ssh/sshd_config …

安装rstudio-server

主要教步骤参考https://posit.co/download/rstudio-server/ 1&#xff0c;首先是linux发行版版本要求&#xff1a;符合 2&#xff0c;预装R&#xff1a;符合 3&#xff0c;安装rstudio-server 4&#xff0c;但是发现web上8787端口打不开&#xff1a; RStudio Server 可能没有在…

不会大模型不要紧!只需5分钟!你也可以微调大模型!如何快速微调Llama3.1-8B

AI浪潮席卷全球并发展至今已有近2年的时间了&#xff0c;大模型技术作为AI发展的底座和基石&#xff0c;更是作为AI从业者必须掌握的技能。但是作为非技术人员&#xff0c;相信大家也有一颗想要训练或微调一个大模型的心&#xff0c;但是苦于技术门槛太高&#xff0c;无从下手。…

Chromium 如何查找V8 引擎中JavaScript 标准内置对象

JavaScript 标准内置对象 - JavaScript | MDN (mozilla.org) 一、JavaScript 标准内置对象 本章介绍和说明了 JavaScript 中所有的标准内置对象、以及它们的方法和属性。 这里的术语“全局对象”&#xff08;或标准内置对象&#xff09;不应与 global 对象混淆。这里的“全局…

【Canvas与标牌】内凹圆角矩形排列组合标牌

【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>内凹圆角矩形Draft3排列组合标牌</title><style type"…

云轴科技ZStack邀您参加迪拜GITEX 2024,10月14日不见不散

云轴科技ZStack期待在GITEX GLOBAL 2024与您相遇&#xff0c;共同探索科技的未来。 10月14日至18日&#xff0c;ZStack将携最新的云计算解决方案与AIOS智塔平台&#xff0c;亮相全球顶尖科技盛会——GITEX GLOBAL 2024 展览会&#xff0c;展位Hall 8-C20&#xff0c;向全球观众…

Git客户端使用之TortoiseGit和Git

git客户端有两个分别是TortoiseGit和Git Git用于命令行TortoiseGit用于图形界面。无论是Git还是TortoisGit都需要生成公/私钥与github/gitlab建立加密才能使用。 一、先介绍Git的安装与使用 1、下载与安装 安装Git-2.21.0-64-bit.exe(去官网下载最新版64位的)&#xff0c;安…

阿里P8面试官推荐学习的11大专题:java面试精讲框架文档

本篇文章给大家分享一波&#xff0c;阿里P8面试官推荐学习的11大专题&#xff1a;java面试精讲框架文档&#xff0c;主要包含11大块的内容&#xff1a;spring、springcloud、netty、zookeeper、kafka、Hadoop、HBASE、Cassandra、elasticsearch、spark、flink&#xff1b;希望大…

抢先体验上海交大最新大模型Agent心理诊所!论文一作深度解读角色扮演Agent前沿进展

在当今社会的快节奏生活下&#xff0c;人们对于心理健康的关注度也在持续提升。然而&#xff0c;如今的心理健康医疗资源明显不足&#xff0c;尤其是在低收入和中等收入国家。同时&#xff0c;相关医疗资源的分布也主要集中在城市和大型机构&#xff0c;这种分配不平衡导致大量…