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

我用两个月时间,终于把优快云付费资源项目玩明白了! 关于项目的定位,这是一个知识付费项目,根据市场研究机构的数据显示,到2023年,全球知识付费市场规模将达到2000亿美元,所以说知识付费的前景是十分广阔的,当下互联网时代信息大爆炸,80后、90后、00后群体对知识付费的认可度也大幅提升,同时这群作为知识付费的主流人群已经具备了更强的消费能力,而且对于知识付费的需求更高。目前整个知识付费领域仍然在发展起步的初期,尽快在知识付费领域布局可以帮助我们在这波红利中获得一份不错的收益。而且个人认为, 阅读详情

时间分片

  • react的任务可以被打断,其实就是基于时间分片的
  • 人眼最高能识别的帧数不超过30帧,电影的帧数差不多是在24
  • 浏览器的帧率一般来说是60帧,也就是每秒60个画面, 平均一个画面大概是16.5毫秒左右
  • 浏览器正常的工作流程是运算渲染,运算,渲染运算渲染
  • 在浏览器里面一个运算,加上一个渲染就是一帧
  • 总的来讲,可以理解为下面这张图
  • 比如 frame 是一帧,一个 Frame 就是16毫秒左右
  • 黑色部分是浏览器的渲染,蓝色部分是js的运算
  • 在16毫秒以内(一帧), 浏览器会重新渲染画面,然后再加上JS的一轮事件循环的执行
  • 根据任务队列循环下去,一秒 60 帧,每一帧都是 js的执行 + 浏览器的渲染
  • 但是, js它是单线程的, 会阻塞浏览器渲染, 假如 js执行时间超长,占了 3 ~ 4帧
  • js执行的时候,浏览器是不能渲染的,那这个时候会有页面卡顿的感觉
    • 实际上这个时候是 js 在执行
    • 这个也是react它去递归渲染的时候的问题
    • 递归渲染,它就是属于长进程,相当于在 render 的时候 js 一直把渲染进程给卡住
  • 这个是很苦恼的问题,所以诞生了fiber架构, react希望能够把任务分片处理
  • 这个时候就提到了一个概念,就是 fiber reconciler 要做的事情
  • 它如何让我们把时间分片,然后让又让浏览器不卡顿的呢?
    • 其实特别的巧妙,谷歌浏览器底层提供的一个东西叫做 requestIdleCallback
    • 前面说到一帧(16ms左右) 是 渲染 + js的执行
    • 有时候浏览器比较空闲,有可能一帧不需要 16ms,可能需要6ms, 那剩下的10ms可以执行长任务
    • 当剩下的10ms用完,可以把浏览器的渲染权利再还给浏览器
    • 这个时候进入下一帧的浏览器的画面,继续渲染,渲染完之后又有剩余时间
    • 接着再执行这个长进程,简单来说,就是把长进程拆分成一个个很小的任务
    • 它利用浏览器每一帧的空闲时间去执行,这样就实现了任务的打断,而且还不阻塞浏览器的渲染
  • 也就是说,本来一个任务要执行1秒,但是实际上react的fiber架构可能让这个1秒执行的时间更长
  • 因为任务的拆分其实是增加了这个计算的开销的,但是,它却是在我们每一帧的空闲时间去执行的
  • 虽然执行的整体时间可能变长,但是让用户的感觉没有那么卡顿,所以它的体验是提升了的
  • 参考之前 React 16的时间片:https://blog.youkuaiyun.com/Tyro_java/article/details/135586572

关于 requestIdleCallback

  • 文档:https://developer.mozilla.org/zh-CN/docs/Web/API/Window/requestIdleCallback

  • window.requestIdleCallback() 方法插入一个函数,这个函数将在浏览器空闲时期被调用

  • 这使开发者能够在主事件循环上执行后台和低优先级工作,而不会影响延迟关键事件,如动画和输入响应

  • 函数一般会按先进先调用的顺序执行,然而,如果回调函数指定了执行超时时间timeout,则有可能为了在超时前执行函数而打乱执行顺序

  • requestIdleCallback(callback)

  • requestIdleCallback(callback, options)

    • callback
      • 一个在事件循环空闲时即将被调用的函数的引用。函数会接收到一个名为 IdleDeadline 的参数
      • 这个参数可以获取当前空闲时间以及回调是否在超时时间前已经执行的状态
    • options 可选
      • 包括可选的配置参数。具有如下属性
        • timeout
          • 如果指定了 timeout,并且有一个正值,而回调在 timeout 毫秒过后还没有被调用
          • 那么回调任务将放入事件循环中排队,即使这样做有可能对性能产生负面影响
  • 返回值是一个ID,可以把它传入 Window.cancelIdleCallback() 方法来结束回调

关于 requestAnimationFrame

  • 文档:https://developer.mozilla.org/zh-CN/docs/Web/API/window/requestAnimationFrame
  • window.requestAnimationFrame() 告诉浏览器——你希望执行一个动画
  • 并且要求浏览器在下次重绘之前调用指定的回调函数更新动画。该方法需要传入一个回调函数作为参数
  • 该回调函数会在浏览器下一次重绘之前执行
  • requestAnimationFrame(callback)
    • callback
      • 当你的动画需要更新时,为下一次重绘所调用的函数
      • 该回调函数会传入 DOMHighResTimeStamp 参数,该参数与 performance.now() 的返回值相同
      • 它表示 requestAnimationFrame() 开始执行回调函数的时刻
    • 返回值
      • 一个 long 整数,请求 ID,是回调列表中唯一的标识, 是个非零值,没有别的意义
      • 你可以传这个值给 window.cancelAnimationFrame() 以取消回调函数请求

requestIdleCallback 和 requestAnimationFrame 的区别


1 )react fiber 引起的关注

  • 组件树转换为链表,可分段渲染
  • 渲染时可以暂停,去执行其他高优先任务,空闲时再继续渲染
  • 如何判断空闲?requestIdleCallback

2 ) 区别

  • requestAnimationFrame 每次渲染完都会执行,高优, 是在下一帧渲染之前执行
  • requestIdleCallback 空闲时才会执行,低优
    let curWidth = 100
    const maxWidth = 400
    
    function addWidth() {
      curWidth = curWidth + 3
      box.style.width = `${curWidth} px`
      if (curWidth < maxWidth) {
        widndow.requestAnimationFrame(addWidth) // 时间不用自己控制 高优先级
        widndow.requestIdleCallback(addWidth) // 时间不用自己控制 繁忙时不会执行
      }
    }
    
    addWidth()
    

3 ) 对比

  console.info('start')
  window.requestIdleCallback(()=>{
    console.log('requestIdleCallback')
  })
  window.requestAnimationFrame(()=>{
    console.log('requestAnimationFrame')
  })
  setTimeout(()=>{
    console.log('setTimeout')
  })
  console.info('end')
  • 执行顺序
    • start
    • end
    • timeout 优先级更高
    • requestAnimationFrame 宏任务优先级较高
    • requestIdleCallback 宏任务优先级较低

4 )总结

  • 两者都是宏任务
  • 需要等待dom渲染完才会执行
react源码分析:实现react时间分片 上文提到过,时间分片其实就是一个固定而连续且有间隔的时间区间固定:时间分片是工作时长是固定的连续:分片之间是连续的,当前分片内有工作没做完,会留到下个分片继续有间隔:在进入下一个分片前,会有一定时间的间隔这些解释比较抽象,可以更加通俗去理解固定:每天固定工作8小时连续:每天都要上班有间隔:明天上班前会休息一段时间读完这篇文章估计你可能对时间分片的概念已经有所有了解了,是不是觉得react16的新特性之一时间分片,也并没有想象中的神秘。总的下来,时间分片就是由简单的三个模块组成:1.分片开启。 阅读详情

相关推荐

【React原理 - 任务调度和时间分片详解】

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

weixin_44273311的博客 2321

基于Spring+Quartz的分布式任务调度(原理剖析、二次开发)

Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的程序。Jobs可以做成标准的Java组件或 EJBs。 Quartz的优势: 1、Quartz是一个任务调度框架(库),它几乎可以集成到任何应用系统中。 2、Quartz是非常灵活的,它让您能够以最“自然”的方式来编写您的项目的代码,实现您所期望的行为 3、Quartz是非常轻量级的,只需要非常少的配置 —— 它实际上可以被跳出框架来使用,如果你的需求是一些相对基本的简单的需求的话。 4、Quartz具有容错机制,并且可以在重启服务的时候持久化(”记忆”)你的定时任务,你的任务也不会丢失。 5、可以通过Quartz,封装成自己的分布式任务调度,实现强大的功能,成为自己的产品。6、有很多的互联网公司也都在使用Quartz。比如美团 Spring是一个很优秀的框架,它无缝的集成了Quartz,简单方便的让企业级应用更好的使用Quartz进行任务的调度。   课程说明:在我们的日常开发中,各种大型系统的开发少不了任务调度,简单的单机任务调度已经满足不了我们的系统需求,复杂的任务会让程序猿头疼, 所以急需一套专门的框架帮助我们去管理定时任务,并且可以在多台机器去执行我们的任务,还要可以管理我们的分布式定时任务。本课程从Quartz框架讲起,由浅到深,从使用到结构分析,再到源码分析,深入解析Quartz、Spring+Quartz,并且会讲解相关原理, 让大家充分的理解这个框架和框架的设计思想。由于互联网的复杂性,为了满足我们特定的需求,需要对Spring+Quartz进行二次开发,整个二次开发过程都会进行讲解。Spring被用在了越来越多的项目中, Quartz也被公认为是比较好用的定时器设置工具,学完这个课程后,不仅仅可以熟练掌握分布式定时任务,还可以深入理解大型框架的设计思想。

InstallShield 打包 自定义安装依赖环境

用InstallShield2020打包.NetFramework4.5程序,程序需要集成Access数据库,必须安装AccessDatabaseEngine引擎,而InstallShield中自带的依赖项不包含该项,所以自定义集成了该依赖项。

zhaoziyu2020的博客 1128

优快云

优快云 将于 2024 年在全国举办多场技术及行业应用的开发者大会、主题峰会、技术沙龙等会议活动,主要领域包括开源,云原生,AI,数据库,DevOps,操作系统,大数据,研发效能,芯片,元宇宙,自动驾驶,金融,工业互联网等。总的来说,优快云作为中国最大的IT社区和服务平台,不仅为软件开发者和IT从业者提供了丰富的学习资源和职业发展机会,还通过其强大的社区影响力和技术权威性,是一个为 IT 技术人成长及科技企业发展提供全方位服务的开发者生态平台,致力于成就一亿技术人,成为技术人交流和成长的家园。

博客 8万+

DFT实战:如何用Synopsys工具搞定多时钟域Scan Chain设计(附避坑指南)

本文详细解析了使用Synopsys DFT Compiler工具链实现多时钟域Scan Chain设计的全流程,包括时钟混合策略、跨时钟域平衡技巧和实战脚本剖析。通过量产验证的工程实践方案,帮助DFT工程师有效解决复杂SoC设计中的Scan Chain挑战,提升测试效率和质量。

mm9012的博客 1035

【向量数据库】Milvus向量数据库 ① 从入门到实战

Milvus是专为海量高维向量设计的开源数据库,支持AI搜索、图像识别、推荐系统等场景。相比传统关系型数据库(如PostgreSQL),它更高效处理语义检索、非结构化数据存储,可毫秒级响应亿级向量查询。单机场景下,推荐配置8GB内存/32GB硬盘,支持FAISS/HNSW等索引算法,支持GPU加速。本文涵盖优快云专属部署教程(CentOS脚本/配置调优),提供避坑指南与扩展资源,并对比分析与传统数据库差异。适合算法工程师、AI开发人员快速上手,附官方下载与性能测试技巧,手把手教你搭建高效向量检索系统!

xiezhiyi007的专栏 1590

React18并发模式

React18版本的发布标志着并发模式的正式应用,实际上自React16引入Fiber架构后,之后的版本工作之一就是为了后续并发模式的引入做铺垫。串行:吃饭和看剧两件事存在先后顺序,即吃饭完后看剧并行:吃饭和看剧两件事同时执行,即吃饭的同时看剧并发:吃饭和看剧交替进行,即是一会吃饭一会看剧React并发模式实际上就是让渲染可以中断从而响应用户操作,之后再恢复执行之前的渲染逻辑,说起来简单但实际上很复杂需要考虑很多事情,例如任务拆分、执行时长把控、整体调度等等。

玉案轩窗的博客 1867

labview汽车电子通用测试程序架构,CAN通讯上位机

结合做过的汽车电子测试项目,车身控制器测试,CAN网络模块测试,电机控制器功能测试,汽车仪表盘视觉及功能测试、电气盒功能测试、EOL下线检测、车用空调控制器功能测试等项目,结合实际项目,整理编写的一个汽车电子,通用测试架构,包含项目的讲解等。6、数据保存 、数据处理、 曲线显示 、报警处理等。7、CAN总线故障信息监控及记录保存。2、参数设置(CAN端口及参数)5、CAN通讯+数据解析。

ali2805486883的博客 2761

谈谈React Fiber与分片

本文首发于:https://github.com/bigo-frontend/blog/ 欢迎关注、转载。 谈谈React Fiber与分片 React的理念和Fiber的出现 从React的Doc上可以看到React的理念是: React is, in our opinion, the premier way to build big, fast Web apps with JavaScript. 但是我们有时候一个很长很深的DOM列表(在没有做列表优化的前提下),setState创建更新后,Rea.

yeyeye0525的博客 384

【Unity3D渲染】Unity3d实现Photoshop的各种图层混合模式

Adobe Photoshop图层混合原理、Unity ShaderLab图层混合实现

a310989583的专栏 2438

文本分析-使用jieba库进行中文分词和去除停用词(附案例实战)

本文将手把手教会你使用jieba库进行中文分词和去除停用词,这是学会文本分析的必经之路!

m0_64336780的博客 4万+

React-fiber架构

Fiber 架构是 React 性能优化的基石,通过可中断的异步渲染和优先级调度,显著提升了复杂应用的流畅性。它不仅重构了底层的协调算法,还为 React 的未来演进(如并发模式、服务器组件)奠定了技术基础。)是 React 16 中引入的核心重构,旨在解决 React 在大型应用中的性能问题,并为异步渲染、并发模式(Concurrent Mode)等高级特性提供底层支持。它是 React 协调算法(Reconciliation)的重新实现,显著提升了应用的响应能力和渲染效率。

qq_44165941的博客 1261

8、内存交织技术详解

本文详细解析了内存交织技术的基本原理、工作机制及实现方式,探讨了其在提升内存访问速度和系统性能中的关键作用。文章还分析了内存交织的优缺点、实际应用场景以及与其他优化技术的结合应用,并提出了未来发展的可能方向,为理解与运用该技术提供了全面参考。

g9h0i1的博客 553

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

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

Wang的专栏 2355

真题库系列之 CCF GESP 2025年12月认证 Python 1级真题含正确答案与解析

学生通过计算机基础知识的学习,了解计算机的构成与操作,以及计算机的发 展历程。通过编程基础知识以及语句的掌握,可以独立完成简单功能的顺序结构、 分支结构、循环结构的程序。

iCloudEnd的博客 320

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

为什么react需要fiber架构,而vue却不需要?

React Fiber 是 React 16 引入的新架构,用于改造其协调(Reconciliation)过程—— 也就是在状态变更后如何高效地计算并应用更新到 DOM。可中断渲染优先级更新时间分片增量更新异步渲染准备(为 Concurrent Mode 做准备)方面React (Fiber 架构)Vue (响应式系统)渲染粒度函数组件整体重渲染精细依赖追踪,只更新相关部分响应式机制基于 state/setState,需调和全组件树基于 Proxy(Vue 3),精细追踪依赖关系。

qq_25416827的博客 1186

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

React Fiber架构实现原理详解

React Fiber架构是React核心算法的重构,旨在解决大型应用响应卡顿问题。传统递归更新方式无法中断,导致主线程阻塞。Fiber架构将更新任务拆分为可中断的小单元,通过优先级调度和双缓存技术实现异步渲染。Fiber节点包含组件信息、链表指针和状态数据,构成可遍历的工作单元。更新分为可中断的render阶段(协调差异)和不可中断的commit阶段(DOM操作)。Fiber还引入时间切片和优先级调度机制,确保高优先级任务优先执行。这些改进使React能更高效地处理复杂UI更新,为并发模式奠定基础。

油墨香^-^的博客 1020

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

React核心原理:虚拟DOM与Fiber架构深度解析

虚拟DOM是现代前端框架的核心技术之一,它通过轻量级的JavaScript对象模拟真实DOM结构,实现高效的UI更新。其核心原理是通过差异对比算法(diff算法)计算出最小变更集,再批量更新真实DOM,从而提升渲染性能。React框架在此基础上发展出Fiber架构,通过任务分片和优先级调度解决了传统渲染引擎的阻塞问题。在工程实践中,理解虚拟DOM的协调过程(Reconciliation)和Fiber的工作循环机制,能帮助开发者精准优化组件渲染性能,特别是在处理复杂列表、动画交互等场景时。本文深入剖析Reac

weixin_31714129的博客 187

React源码详细解读(二):理解fiber

本篇教程是基于React18版本,对应的代码在。

QQ2206487433的博客 922

react 18 的fiber算法

React 18 的 Fiber 算法是 React 16 后引入的全新虚拟 DOM 架构和可中断调度引擎,解决了老版本同步递归渲染导致的页面卡顿问题。它将大任务拆分为可暂停、恢复、优先级调度的小任务,通过链表结构实现中断和恢复。Fiber 包含可中断的协调阶段和不可中断的提交阶段,是 React 18 并发渲染、自动批处理等功能的基石。相比 Vue3 的一次性渲染,Fiber 提供了更高的流畅度和并发能力,但实现复杂度更高。Fiber 架构让 React 实现了不卡顿的用户体验,是 React 18 最核

weixin_45549481的博客 435

React 18 Fiber架构解析与性能优化实践

Fiber架构是React 18的核心革新,通过将渲染过程从递归改为可中断的链表遍历,实现了更高效的调度机制。虚拟DOM diff算法在Fiber中被拆分为可恢复的单元任务,配合优先级调度系统,能够确保用户交互等高优先级任务即时响应。这种架构特别适合需要处理大量动态更新的场景,如电商后台管理系统或数据可视化平台。通过时间切片(Time Slicing)和双缓冲技术,React在保持60fps流畅度的同时,支持了Suspense等并发特性。开发者可以通过React.memo优化组件渲染,合理使用key属性,以

weixin_31421613的博客 259

react的filber架构

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

qq_25416827的博客 1206

React底层原理详解

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

警警的博客 3540

React 18 Fiber架构原理与性能优化实战

虚拟DOM作为现代前端框架的核心技术,通过内存计算减少直接DOM操作带来的性能损耗。React 18引入的Fiber架构对虚拟DOM进行了革命性改造,采用链表数据结构实现可中断的增量渲染,配合双缓冲机制和优先级调度策略,大幅提升了复杂应用的交互流畅度。在工程实践中,这种架构尤其适合处理大型表单、数据看板等高交互场景,通过时间切片技术将长任务分解为5ms以内的微任务块,保证60fps的渲染性能。结合React Profiler和性能测量API,开发者可以精准定位渲染瓶颈,运用memo优化、批量更新等手段实现毫

weixin_28700593的博客 79

React底层架构深度解析:从虚拟DOM到Fiber的演进之路

React通过JSX语法将组件转换为轻量级JavaScript对象(即虚拟DOM),而非直接操作真实DOM。• 双缓冲技术:维护current(当前树)与workInProgress(构建树),避免渲染过程出现页面闪烁。• 性能飞跃:通过Diff算法对比新旧虚拟DOM差异,仅更新变化部分,减少真实DOM操作次数。• 任务分片:将组件树拆解为可中断的Fiber节点链表,每个节点包含组件类型、状态等信息。• 跨平台能力:抽象出与平台无关的UI描述,支持Web、Native、VR等多端渲染。

警警的博客 1174
上一篇: 前端架构: 脚手架开发流程中的难点梳理
下一篇: 前端架构: 简易版脚手架开发
Wang's Blog
博客等级 码龄12年 7434粉丝 2421原创
评论 1
成就一亿技术人!
拼手气红包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、付费专栏及课程。

余额充值