React18原理: 时间分片技术选择

【React原理 - 任务调度和时间分片详解】 本文从源码角度分析从状态更新到合成事件到优先级转换,一步一步到Scheduler任务调度。详细介绍了其中内部实现原理和逻辑。 阅读详情

渲染1w个节点的不同方式


1 )案例1:一次渲染1w个节点

<div id='root'><div>

<script type="text/javascript">
	function randomHexColor() {
		return "#" + ("0000"+ (Math.random() * 0x1000000 << 0).toString(16)).substr(-6);
	}

	setTimeout(function() {
		var k = 0;
		var root = document.getElementById("root");
		for(var i = 0; i < 10000; i++) {
			k += new Date - 0 ;
			var el = document.createElement("div");
			el.innerHTML = k;
			root.appendChild(el);
			el.style.cssText = `background: ${randomHexColor()};height: 40px`;
		}
	},1000);
</script>

1 次完成 1w 个节点的渲染

可以看到,圈中的部分,明显被阻塞,这一块绝对会导致用户体验很差

2 )案例2: 1w 个节点分100次执行,每次执行100个

<div id='root'><div>

<script type="text/javascript">
	var root = document.getElementById("root");

	function randomHexColor() {
		return "#" + ("0000"+ (Math.random() * 0x1000000 << 0).toString(16)).substr(-6);
	}

	function loop(n) {
		var k = 0;
		console.log(n);
		for(var i = 0; i < 100; i++) {
			k += new Date - 0 ;
			var el = document.createElement("div");
			el.innerHTML = k;
			root.appendChild(el);
			el.style.cssText = `background: ${randomHexColor()};height: 40px`;
		}
		if (n) {
			// 内部再调用 n-1次 loop,总计调用 n 次 loop
			setTimeout(function() {
				loop(n - 1);
			}, 40)
		}
	}

	// 1s 执行一次
	setTimeout(function() {
		loop(100)
	}, 1000);
</script>
  • 这里,40ms 执行一次,100次,共4s执行完成
  • 可以看到,没有明显的阻塞

为什么会有如此区别

  • 究其原因是因为浏览器是单线程,它将GUI描绘,时间器处理,事件处理,JS执行远程资源加载统统放在一起,当做某件事,只有将它做完才能做下一件事
  • 如果有足够的时间,浏览器是会对我们的代码进行编译优化(JIT) 及进行热代码优化,一些DOM操作,内部也会对reflow进行处理
  • reflow是一个性能黑洞,很可能让页面的大多数元素进行重新布局
  • 所以,浏览器歇一会儿跑一会儿,比一直跑性能更好

时间分片技术方案选择


1 )注意兼容问题

  • 注意,在 request18 版本并没有使用 requestIdleCalback, 仍旧因为兼容问题

2 ) 方案选择

  • 在浏览器环境中,常见的macro task有setTimeout、MessageChannel、postMessage
  • 而常见的 micro task 有 MutationObsever, Promise.then

2.1 微任务问题

  • 为什么不使用微任务呢?
  • 宏任务是在下一轮事件循环中执行,微任务是在当前时间循环中执行
  • 微任务将在页面更新前全部执行完,也就是是要在当前帧执行完的,所以达不到「将主线程还给浏览器」的目的
  • 使用微任务就会造成一个问题,在极端情况下,一直卡在当前帧,因为微任务是在当前帧执行完的(本轮事件循环内)
  • 所以在 setTimeout, MessageChannel, postMessage 三选一
  • 为什么不使用setTimeout(fn,0)呢?
    function timer() {
      console.ltme('计时器')
      setTimeout(() => {
        console.timeEnd('计时器')
        timer()
      }, 0)
    }
    
    timer()
    
    • 递归的setTimeout()调用会使调用间隔变为4ms,导致浪费了4ms
    • 这是一个递归的定时器,在递归的时候,看下它的间隔时间
    • 在定时器递归大约4次以后,它的递归时间就变成了4ms~ 5ms 变得不准确
    • 明明我们指定的是 0ms, 这里差距有些大了,所以这个api有些问题,误差太大

2.2 宏任务问题

  • 为什么不使用 rAF() 呢?

    • 如果上次任务调度不是rAF()触发的,将导致在当前帧更新前进行两次任务调度
    • 页面更新的时间不确定,如果浏览器间隔了10ms才更新页面,那么这10ms就浪费了
  • React Scheduler使用MessageChannel的原因为:生成宏任务,实现:

    • 将主线程还给浏览器,以便浏览器更新页面
    • 浏览器更新页面后继续执行未完成的任务
      const { port1, port2 } = new MessageChannel();
      
      port1.onmessage = function (event){
        console.log('收到来自port2的消息:', event.data);//收到来自port2的消息: pong
      };
      
      port2.onmessage = function (event) {
        console.log('收到来自port1的消息:', event.data);//收到来自port1的消息: ping
        port2.postMessage('pong');
      };
      port1.postMessage('ping');
      
react源码分析:实现react时间分片 上文提到过,时间分片其实就是一个固定而连续且有间隔的时间区间固定:时间分片是工作时长是固定的连续:分片之间是连续的,当前分片内有工作没做完,会留到下个分片继续有间隔:在进入下一个分片前,会有一定时间的间隔这些解释比较抽象,可以更加通俗去理解固定:每天固定工作8小时连续:每天都要上班有间隔:明天上班前会休息一段时间读完这篇文章估计你可能对时间分片的概念已经有所有了解了,是不是觉得react16的新特性之一时间分片,也并没有想象中的神秘。总的下来,时间分片就是由简单的三个模块组成:1.分片开启。 阅读详情

相关推荐

CCF201803-2 碰撞的小球 python

一些话:已经不知道是第几次做这道题了(大概第三次吧),真的常做常新,每次都有新的细节想法。虽然方法简单粗暴,但好在方便理解,对于我这种菜鸟选手而言。 但在做的过程中,最开始还忽略了输入的小球初始位置有可能是无序的,输出的时候要保持相对位置。CCF真的考验细节,希望上考场时能够认真仔细一点。就酱… #碰撞的小球 #当小球坐标为0或L时,会朝相反方向移动 #当两个小球坐标相等时,会分别转向相反的方向 #计算t秒之后小球的位置 n,L,t = map(int,input().split()) location .

tanya_dre的博客 352

React 探秘(三): 时间切片

react使用时间切片提升渲染性能,在熟知原理后,同样我们在业务中也有很多优化场景可以使用到。例如:高频埋点批量切片上传,大量 dom 节点操作等等。

qq_44983621的博客 1926

虚拟机安装Centos8.5

Centos8.5

weixin_63604047的博客 960

react scheduler之任务调度和时间切片学习笔记

我们日常使用App,浏览网页时,有两类场景会制约快速响应:CPU的瓶颈: 当遇到大计算量的操作或者设备性能不足使页面掉帧,导致卡顿IO的瓶颈: 发送网络请求后,由于需要等待数据返回才能进一步操作导致不能快速响应。

奔跑的小猪仔 1413

糖果【贪心】

【问题描述】 有N(1≤N <100,000)N(1≤N~<100,000)N(1≤N <100,000)种不同类型的糖果,每种糖果数量无限多。第i种糖果每颗的价格是Pi(1≤Pi≤1018),有Ci(1≤Ci≤1018)P_i(1≤P_i≤10^{18}),有C_i (1≤C_i≤10^{18)}Pi​(1≤Pi​≤1018),有Ci​(1≤Ci​≤1018)头牛想吃这种糖果。 FarmerJohnFarmer JohnFarmerJohn拥有金钱BBB元(1≤B≤1

算法小猪的博客 798

保姆级教程:用NX机电概念设计与RobotStudio实现ModbusTCP联合仿真(附完整代码)

本文提供了一份详细的NX机电概念设计与RobotStudio联合仿真实战教程。通过ModbusTCP协议构建数据桥梁,实现机械行为与机器人控制逻辑的双向实时同步。文章从环境搭建、信号配置、RAPID代码编写到联合调试,逐步拆解了实现数字孪生核心链路的关键步骤,并分享了常见问题排查方法,助力工程师在虚拟环境中提前验证产线协同。

sat99的博客 1101

React18原理: 再聊Fiber架构下的时间分片

react的任务可以被打断,其实就是基于时间分片的,人眼最高能识别的帧数不超过30帧,电影的帧数差不多是在24,浏览器的帧率一般来说是60帧,也就是每秒60个画面, 平均一个画面大概是16.5毫秒左右,浏览器正常的工作流程是运算渲染,运算,渲染运算渲染,在浏览器里面一个运算,加上一个渲染就是一帧

Wang的专栏 2796

addBumpConnectTargetConstraint 命令详解

本文介绍了Cadence Innovus中用于倒装芯片设计的addBumpConnectTargetConstraint命令的核心功能和使用方法。该命令主要用于为凸点(Bump)添加连接目标约束,通过绑定实例、引脚/网络和端口号等属性,实现凸点与电源/信号网络的精准映射。文章详细解析了命令语法结构、参数说明及使用场景,包括必选参数(指定凸点方式)、分支选择(实例连接或电源连接类型)以及互斥参数(引脚名与网络名)等重要注意事项,并提供了典型应用示例。该命令特别适用于倒装芯片设计中凸点与PG网络、IO实例的连接

u013620135的博客 395

React18原理: 核心包结构与两大工作循环

react中的工作循环,这是它的一个最顶层的一个流程图,在这张图里面,有两个核心的大循环,第一大循环是 react-reconciler 提供的,它的核心是构建fiber树,生成任务,第二大循环是 scheduler 提供的, 它的核心是任务调度(处理任务的优先级),react的原理实际上就是两大工作循环

Wang的专栏 2355

030、自动白平衡AWB实战:灰度世界、完美反射与色温估计的工程实现与局限

本文深入探讨了自动白平衡(AWB)算法在工程实践中的实现与局限性。作者结合实际项目经验,分析了灰度世界算法、完美反射算法和色温估计三种主流方法的优缺点和适用场景,并分享了调试过程中的关键技巧和常见陷阱。文章指出,纯色背景、多光源环境等特殊场景容易导致算法失效,需要通过混合策略和场景检测来优化。作者强调AWB调试需要大量实际场景测试,建议保留手动调节功能,并针对不同硬件配置进行参数标定。最后提出,AWB优化是一个持续迭代的过程,需要工程化的测试方法和数据处理能力。

zzfmlxs的博客 283

Ubuntu 22.04+/WSL2 中解决 `error: externally-managed-environment` 并成功安装 PyTorch + vLLM 的完整指南

Ubuntu 22.04+/WSL2 因遵循 PEP 668 规范,系统 Python 被标记为“外部管理”,导致直接使用 pip install 安装包时报错 externally-managed-environment。解决方案是创建虚拟环境: 通过 python3 -m venv ~/vllm-env 创建隔离环境 激活环境后安装 PyTorch(CUDA 12.1)和 vLLM 避免使用 sudo pip 或 --break-system-packages,防止破坏系统依赖 关键点: 虚拟环

刘一说的IT专栏 298

一文搞懂React18原理

可能一直在写代码的路上,大多数时候就是个工具人。今天一起看看react18的实现原理,持续学习中。

相信自己,没有攀不过去的高山! 1801

128、点云配准与ICP:经典配准算法与深度学习配准

上周调试一台双臂协作机器人,左手持结构光相机扫描桌面上的随机堆叠工件,右手准备执行抓取。问题出在“对齐”这一步——相机扫描得到的点云和CAD模型点云之间差了大约15度的旋转,导致抓取姿态计算出来直接怼到桌面上。我第一反应是“ICP跑一下不就行了”,结果跑了三分钟,误差纹丝不动,甚至越迭代越发散。后来查了日志才发现,初始位姿给得太离谱,ICP直接掉进了局部最优。这个场景太典型了——很多人以为点云配准就是调个ICP库函数,实际工程里坑比想象中多得多。今天这篇笔记,咱们把点云配准这件事从头捋一遍。

sundong_81的博客 49

React底层原理详解

React通过虚拟DOM、Fiber架构、合成事件等机制,在保证开发效率的同时优化性能。其底层设计(如并发模式)使应用更响应迅速,而状态管理与组件通信机制则提供了灵活的架构扩展能力。理解这些原理有助于解决复杂场景的性能问题,并深入掌握React生态技术栈。

警警的博客 3540

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

彻底搞懂 React 18 并发机制的原理

React 18 最主要的特性就是并发了,很多 api 都是基于并发特性实现的。那为什么 React 要实现并发?什么是并发?又是怎么实现的呢?这篇文章我们就一起来探究一下。首先,我们过一遍 React 渲染的流程:React 渲染流程React 是通过 JSX 描述页面的,JSX 编译成 render function(也就是 React.createElement 等),执行之后产生 vdom...

奇舞周刊 746

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

React源码揭秘 | scheduler 并发更新原理

React 18增加了并发更新特性,开发者可以通过useTransition等hooks延迟执行优先级较低的更新任务,以达到页面平滑切换,不阻塞用户时间的目的。其实现正是依靠scheduler库。scheduler是一个依赖时间片分片的任务调度器,React团队将其单独发包,你可以通过以下指令来单独使用。在CPU密集操作中(如大量echarts数据补点等)可以借助scheduler将大的任务拆分成子任务运行,并且不阻塞渲染引擎以及用户事件。

weixin_40710412的博客 1548

React核心原理深度解析:从理念到架构的完整指南

React作为现代前端开发的基石,其设计理念和架构思想深刻影响着整个前端生态。just-react项目通过自顶向下的方式,为我们揭示了React从理念到实现的全貌。本文将带你深入理解React的核心概念,掌握其架构精髓。 ## 🔍 React设计理念:快速响应的用户体验 React的核心目标是实现**快速响用的用户体验**。这包含了两个关键方面: - **CPU瓶颈**:当大量DOM操作导

gitblog_00564的博客 738

react 15-16-17-18各版本的核心区别、底层原理及演进逻辑的深度解析--react18

React 18 是一次重大的版本升级(发布于2022年),引入了并发渲染(Concurrent Rendering) 和一系列新特性,旨在。

楠姐的博客 1493

React大型树形组件性能优化:分片渲染与requestIdleCallback实践

在大型前端应用开发中,渲染性能优化是核心挑战之一,尤其当面对数据量大、交互复杂的树形结构时。其原理在于浏览器主线程的单线程特性,一次性渲染庞大组件树会导致长时间阻塞,造成页面卡顿。通过分片渲染技术,将大型任务拆解为多个小任务,并结合requestIdleCallback API利用浏览器的空闲时间执行,可以显著提升页面响应度与用户体验。这种技术方案对于管理后台、配置中心等需要处理超大型可配置树形结构的应用场景具有重要价值。本文以useChunkTree自定义Hook为例,深入剖析了如何实现状态与渲染分离,将

weixin_30566111的博客 394

react 15-16-17-18各版本的核心区别、底层原理及演进逻辑的深度解析--react16

React 16.3+ 新增 forwardRef,支持向子组件传递 Ref(解决 HOC 中的 Ref 穿透问题)。引入 React.createRef() 和回调 Refs 的标准化用法,替代字符串类型的 Refs(已废弃)。客户端 hydrate() 方法替代 render(),更高效地复用服务端渲染的 HTML。生命周期方法,允许组件捕获子组件树中的 JavaScript 错误,避免整个应用崩溃。(prevProps, prevState)(在 DOM 更新前捕获信息,如滚动位置)。

楠姐的博客 1469

AntD Upload + React Uploady + 分片上传 + 断点续传 + 心跳机制(面试及代码)

断点续传客户端定时发请求(ping)服务端回(pong)一段时间没回应 → 判定断连。

2302_80473627的博客 724

腾讯云前端面试:React原理与实时通信技术解析

React Fiber架构通过双缓冲机制优化渲染性能,其核心在于将协调过程拆分为可中断的微小任务单元,实现界面更新的平滑过渡。在前端工程化实践中,结合useMemo和React.memo可有效控制大型表单的重复渲染。实时通信技术如SSE(Server-Sent Events)与WebSocket各有适用场景,SSE基于HTTP长连接,适合服务端到客户端的单向数据推送,如物联网设备状态监控;而WebSocket支持全双工通信,适用于设备远程控制等交互场景。这些技术在腾讯云控制台等大型应用中具有重要价值,特别是

weixin_34294649的博客 411

【React】React 性能优化

在最后插入数据有无key 意义不大。前面插入数据如果没有 key 后面的节点都需要修改,如果有key ,原节点只需要移动,不需要修改。React 在props 或者 state 发生改变时,会调用 React 的render 方法,创建一颗不同的树。:父组件渲染(父组件render 调用,所有子组件的render 都会重新调用)、(SCU) 生命周期,进行强制渲染。React 18 的更新流程基于。、Context 变化等。

小秀的博客 1694

react的filber架构

触发更新setStateuseState调度器接管→ 把更新放入任务队列。调和阶段(可中断):构建新的 Fiber 树,标记变更。提交阶段(不可中断):批量更新真实 DOM。渲染完成,用户看到更新。

qq_25416827的博客 1206
上一篇: 前端架构: 本地调试脚手架的2种方式
下一篇: React18原理: 核心包结构与两大工作循环
Wang's Blog
博客等级 码龄12年 7434粉丝 2421原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值