前端性能优化(二):浏览器渲染优化

news2024/9/29 15:23:50

目录

一:浏览器渲染原理和关键渲染路径(CRP)

1.1.浏览器渲染过程

1.2.DOM树

 1.3.CSS树

 1.4.浏览器构建渲染树

二:回流与重绘

2.2.影响回流的操作

2.3.避免布局抖动(layout thrashing)

三:使用FastDom批量对DOM的读\写操作(防止布局抖动)

四:复合线程与图层

4.1.复合线程(compositor thread)作用

4.2.利用 DevTools 了解网页的图层拆分情况

五:减少重绘

5.1.如何监视重绘区域

六:高频事件防抖

七:React时间调度实现

7.1.基本原理

7.2.requestIdleCallback在React 里的实现:


一:浏览器渲染原理和关键渲染路径(CRP)

浏览器怎么把页面渲染出来,渲染过程分很多环节,就是 关键渲染路径(Critical Rendering Path

1.1.浏览器渲染过程

JavaScript -> Style -> Layout -> Paint-> Composite

  • JavaScript(触发视觉变化):可以通过 JavaScript 实现一些页面上视觉上的变化,例如:添加 DOM 元素、jQuery实现动画、CSS 动画
  • Style(浏览器对样式重新进行计算):这个过程会根据选择器进行重新匹配,计算哪些元素 CSS 受到影响,新的规则是什么样的,应该绘制成什么样子
  • Layout(布局):布局就是把元素按照样式绘制到页面上,实际上是几何问题,需要知道元素的大小、位置
  • Paint(绘制):真正把内容绘制到页面上:文字、图片、颜色、阴影等
  • Composite(合成):绘制会和这个合成联系,浏览器为了提高效率,并不是把所有东西都画在一个层里,会建多个图层,最后再把它们组合起来

1.2.DOM树

  1. 浏览器下载完 HTML 文档,就要把代码读进去,读进去的是文本,它先把这些文本转换成单个的字符
  2. HTML 有很多标签,标签是通过一对尖括号标记出来的,这个尖括号就可以用作于识别,就可以把一些字符串理解成有含义的标记,这些标记最终被换成节点对象,放在链形数据结构里,如下图

 1.3.CSS树

当解释器遇到引用的 CSS,会先把资源下载下来,下载完成后对这个资源进行文本处理,把里面的标记全部识别出来,看样式是哪个节点的样式,然后用树形结构把这个关系存储起来,如下图

 1.4.浏览器构建渲染树

DOM 和 CSSOM 合并成 Render Tree,把内容和样式合在一起,让浏览器理解最终要把什么画在页面上。合并的时候会把需要显示的留下,不需要显示的删除

二:回流与重绘

2.1.布局(layouts)与绘制(paint)

是关键渲染路径中最重要的两个步骤,也是开销最高的两个步骤

  • 渲染树只包含网页需要的节点
  • 布局计算节点精确的 位置和大小——“盒模型”
  • 绘制是像素画每个节点的过程

2.2.影响回流的操作

布局也叫回流(reflow)。布局:通常页面第一次加载完成之后,把东西放在页面上。回流:由于页面上发生了视觉上的变化又再次导致重新布局

  • 添加/删除元素
  • display: none
  • 移动元素位置
  • 操作 styles
  • offsetLeftscrollTopclientWidth
  • 修改浏览器大小、字体大小

 可以在Performance性能选项卡的load节点之后查看Layout与Paint过程

2.3.避免布局抖动(layout thrashing)

  • 避免回流

    比如想改变元素位置,千万不要修改 top、left 这样的值,可以使 transform 或 translate 来进行位移;或者使用某些框架也能够避免某些回流

  • 读写分离

    批量的读操作再进行批量写操作

三:使用FastDom批量对DOM的读\写操作(防止布局抖动)

FastDom地址:https://github.com/wilsonpage/fastdom

主要核心就是两个方法,measure是进行的操作,mutate是进行的操作;批量的处理是FastDom自动帮我们去完成的,不需要了解如何实现的。只要将读的操作套在measure里,写的操作套在mutate里就可以了

四:复合线程与图层

4.1.复合线程(compositor thread)作用

将页面拆分图层进行绘制再进行复合

页面是怎么拆成不同图层的:

  • 默认情况下它是由浏览器决定的,浏览器会根据一些规则来判断是否将页面拆分成多个图层,又把哪些元素拆分成一个单独的图层(依据元素与元素之间是否有相互影响)
  • 主动的把一些元素提取成一个单独的图层(知道元素会影响其他部分,可以提取出去)

4.2.利用 DevTools 了解网页的图层拆分情况

首先,先在performance选项卡中开启Enable advanced paint instrumentation(slow): 启用高级绘画工具。

然后开启性能分析,结束后选择frames中一块,就能看到layer,点击后就可以查看图层拆分情况

下面的几种操作可以只去触发复合操作,而不会触发重绘

五:减少重绘

利用 will-change 创建新的图层,利用will-change属性,这样浏览器就知道这个元素应当被提取到一个单独的图层里

will-change: transform;

5.1.如何监视重绘区域

在 Network 里,键入 Ctrl + Shift + P,输入 Show Rendering,勾选 Paint flashing,所重绘的区域会用绿色标记出来

六:高频事件防抖

什么是高频事件?

有一些事件触发频率非常高,甚至会超过帧的刷新速率,比如:scrolltouchstarttouchmovemousemove

这些函数触发频率非常快,在 Main 函数里,可以看到事件处理函数消耗比较高,但实际上并没有必要在一帧里处理很多次,比如滚动,并不关心中心过程,只关心最后滚动到哪里,这样就可能会出现卡顿也就是抖动

下图表示一帧的生命周期

 首先,事件开始触发,JS 触发视觉上的变化,然后在布局和重绘之前调用rAF(requestAnimationFrame),这样可以利用 rAF 先把我们做的处理做完,之后再去进行布局和绘制,极大提高效率。并且rAF 本身是由 JavaScript 进行调度的,会尽量让你能够在每一次绘制之前去触发这个 rAF,尽量达到 60fps 的效果

要进行高频事件防抖,只需把要触发的事件放在rAF函数里即可
 

七:React时间调度实现

7.1.基本原理

requestIdleCallback: 官方给出的标准,它的执行希望在 16ms 时间内,如果还有空余时间,它可以让它做些事情,但是这个函数并没有被浏览器进行很好的支持,React 考虑到这点,是通过 rAF 模拟实现 rIC

requestIdleCallback在一帧关键渲染周期内,都做的事情:

requestAnimationFrame 是在 Layout 和 Paint 之前触发。
requestIdleCallback在 Layout 和 Paint 之后触发。在一帧之内,如果所有事情都做完了还有剩余时间,就可以做一些其他的事情。但是这个事要有个度,因为要给主线程留更多的空余时间,因为一旦有交互过来,至少要留 50ms 给每一次交互去处理

7.2.requestIdleCallback在React 里的实现:

当用户不再看这个页面或页面不可见,requestAnimationFrame 是不会运行的,但React 要求这个函数即使在后台状态也要继续完成,所以需要用替代方案能保证任务做完,所以用 setTimeout 来实现
作为调度函数,会给这些任务安排优先级,React 这边安排了 5个优先级,从立即可以执行到有空闲执行,并且这些任务都有过期时间,这些任务的存储有一个队列,把这些队列排到队列里,然后等待 requestIdleCallback 有空闲时去执行,底层实现是双向环形链表
 

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

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

相关文章

如何创建Android图表数据可视化应用程序?图表工具LightningChart助力轻松实现(上)

LightningChart JS 是一款高性能的 JavaScript 图表工具,专注于性能密集型、实时可视化图表解决方案。 LightningChart .JS | 下载试用https://www.evget.com/product/4189/download本次我们将介绍如何使用Android Studio 和 LightningChart JS (IIFE)创建一个 and…

Linux基础-学会使用命令帮助

概述 Linux 命令及其参数繁多,大多数人都是无法记住全部功能和具体参数意思的。在 linux 终端,面对命令不知道怎么用,或不记得命令的拼写及参数时,我们需要求助于系统的帮助文档; linux 系统内置的帮助文档很详细&…

KubeSphere多租户系统

目录 🧡多租户系统层级 🍠集群 🍠企业空间 🍠项目 💟这里是CS大白话专场,让枯燥的学习变得有趣! 💟没有对象不要怕,我们new一个出来,每天对ta说不尽情话&…

路由器OpenConnect图文教程

前提需求 openwrt 路由器或其他能够部署 OpenConnect 的设备建议 上行 30M的宽带以保证使用体验拥有 公网 IP并配置端口映射本文以 openwrt 路由器内网网段 192.168.1.0 为例. 基本设置 登录 OpenWRT路由器,打开 服务 – OpenConnect . 勾选 Enable server 启动服务 默认端…

第005课 - 项目微服务划分图

文章目录 项目微服务划分图项目微服务划分图 admin-vue是面向工作人员使用的前端系统。 shop-vue是面向用户使用的前端系统。 当然我们可以有手机app和小程序。 请求通过api到达微服务群。 业务微服务群: 商品服务优惠服务仓储服务订单服务中央认证服务支付服务用户服务秒杀…

Kubernetes 正式发布 v1.26,稳定性显著提升

太平洋时间 2022 年 12 月 8 号 Kubernetes 正式发布了主题为 Electrifying 的 v1.26。 作为 2022 年最后的一个版本,增加了很多新的功能,同时在稳定性上也得到显著提升,我们将从以下多个角度来介绍 1.26 版本的更新。 更新概览&#xff1a…

app渗透为何一开启代理就断网?

前言 今天测试app,开启安卓代理,一点击准备登录时,抛出了如下提示“java.security.cert.CertPathValidatorException: Trust anchor for certification path not found”,大概意思就是证书的安全性问题 而当我把代理关闭了&#…

一、常用文件管理命令

目录1、LinuxOS 基本文件结构2、文件常用指令1、LinuxOS 基本文件结构 几种路径: 绝对路径:以 / 开头相对路径当前路径:.上一级路径:..home 目录:~/ 2、文件常用指令 ctrl c:取消命令,并且换…

Ubuntu设置USB设备别名

Ubuntu设置USB设备别名硬件连接软件设置更新电平转换芯片的serial创建设备别名使用设备别名硬件连接 ROS主控通过usb线连接到一个TTL电平转换芯片,再由这个电平转换芯片连接STM32芯片 电平转换芯片可以通过PCB设计在STM32芯片的电路板上,也可以使用一个…

2022-12-29 [整理]flex弹性布局

文章目录0.前言1.设置flex布局后的父子元素2.容器(父元素)的属性3.项目(子元素)的属性4.示例一:flex布局实现flex容器中子元素的水平垂直居中5.示例二:flex:1实现子元素平分flex容器宽度6.示例三:换行,多行布局7.示例四:flex-grow,flex-shrink和flex-basis属性的使用7.1.flex-g…

磨金石教育摄影技能干货分享|优秀艺术类摄影作品欣赏

前面我们分析过纪实类摄影和创意类摄影,艺术类还是第一次讲。 它与纪实类的不同点在于,艺术类摄影更注重作者的主观感受,更侧重个人创造性。 摄影师和画家一样,在经历过人生的挫折、现实与理想交织,内心世界往往是丰富…

[年终总结]满意但不满足

看了看去年的总结,哈哈哈哈,还好我对我自己有自知之明,就给自己定了三个目标 亲密关系这块,我觉得自己是做到了 虽然记性很差,连每周跟妈妈视频这种事情都要写在滴答清单里面才能想到,但感觉我的亲密关系,要比以前好很多 在我开心时,有朋友比我还要开心;在我失落时,我能从朋友…

反重力铸造工艺中的高精度快速压力调节解决方案

摘要:针对客户调压铸造炉对真空压力控制系统的技术要求,本文介绍了相应的解决方案和验证试验。方案的技术核心是基于高速动态平衡法,采用大流量压力控制装置,与传感器和真空压力控制器组成PID闭环控制回路,其特点是可快…

深度学习知识速成 I 深度学习工具链名词解释 深度学习原理

深度学习工具链名词解释 更新时间 更新内容 2022年12月29日 初始化 这个是实习的时候自己做的笔记,这里重新整理成文档。需要具有最基本的 CNN 深度学习基础,我的上一篇文章就够了。主要是为了做毕设。 数据工具和框架 数据建模 数据:…

iServer使用影像服务(一)——影像服务的介绍和使用

前言 SuperMap iServer 11i系列提供了影像服务扩展模块,可以将大规模影像或栅格数据快速发布为影像服务;影像服务提供了一种通过Web服务来管理和访问影像或栅格数据的方式。 应用场景 影像服务主要应用场景包括: 直接将现有的影像或栅格数…

群狼调研圆满完成人才住房和保障性住房居民满意度调查

群狼调研圆满完成人才住房和保障性住房居民满意度调查 近期,群狼调研(第三方市场调查)受某地住房研究会委托,对该市人才住房和保障性住房住户进行居民满意度调查工作。 本次调查以线下拦截填报调查问卷以及实地考察的方式开展&a…

恶意软件如何被用来创建虚假的过期证书警报

2021 年 9 月,数字安全专家发现了针对 Windows 用户的广泛攻击。 该攻击使用恶意软件在网站上发出虚假的过期证书警报,提示用户下载更新,而更新实际上包含允许黑客远程访问受感染计算机的恶意软件。 以下是攻击的执行方式、我们目前对其影响…

实习证明| 大数据在线实习项目意义

实习,在实践中学习,任何的知识源于实践,归于实践,最终也要通过实践进行检验,它是衔接学生在校学习与步入社会两个阶段的重要桥梁。一个好的实习机会,会帮助学生积累工作经验、验证职业选择、提升综合素质。…

基于电影评论数据的中文情感分析(含训练数据、验证数据) ,已实现NN(MLP)、CNN、LSTM方法

基于电影评论数据的中文情感分析(含训练数据、验证数据) ,已实现NN(MLP)、CNN、LSTM方法 完整代码下载地址:基于电影评论数据的中文情感分析(含训练数据、验证数据) 基于电影评论数据的中文情感分析 1).数据集 使用电影评论数据作为训练数据集. 其中,…

DaoCloud 结合 Karmada 打造新一代企业级多云平台

上周 Cloud Native Days China 南京站 Meetup 顺利举行,「DaoCloud 道客」大容器团队技术负责人-张潇在会上以《DaoCloud 结合 Karmada 打造新一代企业级多云平台》为主题,与 Karmada 社区及其合作伙伴一起,共同交流云原生多云多集群生产实践…