性能优化之影响分析

news2024/11/22 22:47:03

页面性能的影响

性能非常重要,而具体反映到我们的业务场景中,可能会有如下影响:

  • 不利于用户留存
    • 站点页面的展现速度非常影响用户体验,很多用户会因等待的不耐而放弃站点。
    • 研究表明,47 % 的消费者希望页面能够在 2s 内打开。
      移动端的页面应该在 3 秒钟内完成加载,若超过这个时间,53% 的用户会直接关闭页面。
  • 不利于 SEO
    • 谷歌搜索结果中,会给加载速度慢的页面一个较后的排名。
  • 不利于产品信息分发
    • 用户的空闲总时长是有限的,当花费更多的时间等待页面加载,
      则用于消费价值信息的时间就会减少,从而信息消费量也会大幅减少。
  • 其他等等
    • 79% 的消费者在电商站点性能体验较差的情况下,不会再次访问这个站点。

如何优化

  1. 第一位不是具体手段,而是先收集数据
  2. 收集数据之前需要了解页面从加载到呈现的步骤(越详细越好)
  3. 有了数据可以很清晰的了解我们的短板
  4. 如果不确定哪里是短板可以参考别家的数据
  5. 结合我们的产品形态制定目标和基准
  6. 根据目标“寻找”具体手段进行“优化”

如何分析

Analyzing Critical Rendering Path Performance
分析 关键 渲染 路径 性能

performance

  • 总概念
    • 蓝色(Loading):网络通信和HTML解析
    • 黄色(Scripting):JavaScript执行
    • 紫色(Rendering):样式计算和布局,即重排
    • 绿色(Painting):重绘
    • 灰色(other):其它事件花费的时间
    • 白色(Idle):空闲时间

关键资源分析

这么多指标,我们应该分析那个呢

1、减少网络请求

HTTP2多路复用 长链接 多资源并行请求 header压缩 body压缩 server主动推送
HTTP1 6个并发限制 雪碧图

2、提高打包速度

  1. 减少打包体积
    重复依赖引用重复打包,代码压缩
  2. code split 优化首次加载 按需加载 懒加载
  3. bundle split分包 合理分包,充分利用缓存
  4. 第三方依赖external 减少整体打包编译时间和体积
  • 不适用场景
  • 需要按需引入的 npm 包, 对于按需加载的包没必要用 cdn 全量引入。
  • cdn 引入的形式可能会造成全局污染问题,可根据项目实际情况适用。
  • 对于体积比较大且不是首屏用到的包,用 cdn 形式引入,可能会影响首屏加载速度。

nextjs/image图片解决方案

  • 图片流量优化,通过格式自适应和分辨率自适应以达到提升站点性能并节省流量的目的;
  • 提升视觉稳定性,内置四种图片布局方式,涵盖绝大多数的图片渲染场景,避免累积布局偏移 CLS;
  • 更快的页面加载速度,支持过渡图占位+图片懒加载;
  • 可灵活处理图片资源,支持图片缩放、压缩、格式转换等能力

目标

因此,我们面向 Web 开发者提供了一套图片优化方案,核心目标包括:

  • 降低流量成本:通过图片压缩,分辨率自适应,应用 WebP、AVIF 等高压缩率图片格式,
    减小图片体积,降低站点 CDN 成本,同时也提升图片加载速度;
  • 提升图片用户体验:建立 Web 图片评估体系,支持对站点图片体验做出评估并给出优化建议,
    在减小图片体积的基础上,通过懒加载、图片预占位、稳定性布局等手段提升图片加载的流畅性;
  • 降低开发成本:考虑实际图片场景,提供不同场景下图片优化的最佳实践,降低图片优化成本。
总体可归结为
  • 图片多采用 PNG 格式,压缩率低
  • 预览图直接采用原始大小的图片,存在流量浪费且加载缓慢
  • 图片渲染抖动,加载不流畅,在完成渲染前未采用占位图过渡
  • 图片未进行懒加载

img引入方式

  • 静态引入:代码中静态引入的图片,通常是跟随代码打包的图片,
    此外也包括固定不变的远程URL;
    代码中静态引入的图片,通常是跟随代码打包的图片,此外也包括固定不变的远程URL
  • 动态下发:服务端动态下发的图片,,这类 URL 相对较多且场景复杂
改造方案

引入图片优化组件,接入图片格式自适应、分辨率自适应、大小自适应
图片压缩等能力以减小图片大小,通过懒加载、过渡占位保证图片加载流畅性;

图片体积优化

主要通过图片压缩、格式自适应、分辨率自适应三种方式来减小图片体积

实现格式自适应
<picture>
  <source srcset="image1.webp" type="image/webp" />
  <img srcset="image1.jpg" decoding="async" loading="lazy"/>
</picture>
实现格式和分辨率自适应
<picture>
  <source   
      srcset="image1.webp 200w,
              image2.webp 600w"
      sizes="(max-width: 480px) 100vw, (max-width: 768px) 50vw, 33vw"
      type="image/webp"
   />
     
   <img 
      srcset="image1.jpg 200w,
              image2.jpg 600w"
      sizes="(max-width: 480px) 100vw, (max-width: 768px) 50vw, 33vw"
      decoding="async"
      loading="lazy"
   />
</picture>
不过要注意的是,如果srcset和sizes属性设置不当,
可能会导致浏览器加载不必要的图片或者渲染出不合适的图片尺寸,
从而影响页面的加载速度和显示效果。因此,在使用这些属性时,
我们需要根据具体的情况进行优化和调整,确保图片的加载和显示效果都能达到最佳状态。

图片加载优化

图片加载优化包括懒加载、稳定性布局、占位图过渡、错误兜底等一系列措施,
保证图片加载的流畅性,提升用户体验。

同样参考 next/image 的思路,组件提供了五种稳定性布局:
intrinsic、responsive、fixed、fill、raw,
通过生成稳定的 dom 结构来提升视觉稳定性,尽可能覆盖大多数的图片场景
减少CLS累计布局偏移量
  • intrinsic: 若指定宽度小于容器宽度,则根据指定宽高渲染图片;反之则图片宽度为容器宽,图片高度按照比例缩小;
  • responsive: 图片渲染宽度等于容器宽度,高度按比例缩放;
  • fixed: 根据指定宽高渲染图片;
  • fill: 图片缩放以填充容器,可传入 objectFit、objectPosition
    属性表示不同的填充模式;
  • raw: 组件中将不会插入布局相关的DOM,只保留纯净的 标签,
    图片宽高将由组件中传入的宽高和 CSS 样式共同决定。

img监控

1. 加载耗时

PerformanceResourceTiming
该类指标包括请求资源过程中各个阶段的耗时、资源大小,以及由此推导而来的缓存命中指标

2. 压缩评估和分辩率评估

图片详情
图片格式、大小、尺寸、状态码等,依赖 MutationObserver 以及 Response Header 的信息

3. 格式评估
  1. 收集图片尺寸、体积、状态码以及浏览器信息;
  2. 判断浏览器对图片格式的支持性(可根据 ua 粗略判断 WebP、Avif )
  3. 上面 Jpeg 的压缩比取了 8 : 1,这里对齐Lighthouse,
    保守估计 WebP 取 10 : 1,Avif 取 12 : 1;
  4. 估算采用高压缩比格式后的体积,如果小于原图体积 8KB(插件里阈值取0)
    以上,则认为该图可以进行格式优化。
4. 懒加载评估

该项评估分析是否有不在浏览器视窗内就已经加载的图片,
关键是判断图片加载后拉取图片的元素是否已经在视口内出现过,否则就记作没有懒加载。

如何判断元素是否在视口内出现过?

  1. MutationObserver 监听 dom 元素的增减,在新增元素时通过 IntersectionObserver 监听元素,
    删除元素时停止监听;元素距离视口的阈值设置为100
  2. 若元素出现在视口范围内则更改 imgList 中该元素的状态,同时停止监听;

非首屏资源,NOSSR 或拆分异步加载

数据变化慢的进行接口拆分和接口缓存

图片webp
picture标签拥有兜底图片的特性,优先webp兜底jpg



可以先加载webp图片,监听
img的onerror和onload事件
来查看是否支持webp

svg使DOM结构过大
svg压缩和svgspring

6、 问题分析

JavaScript 在前端是单线程运行的,并且浏览器的一些其它计算行为也会阻塞 JavaScript 代码执行,比如 Paint & Layout。

7、优化应用的FCP

提升server性能是最直接的方式

  1. 优化dom结构(SVG Sprite)
    dom结构复杂会对页面的Hydrate性能产生较大影响,也对ssr性能影响
  2. 前端请求替换成 Server 实现,直接服务端推送
    直接调用 Node 端具体的某个函数直接获取数据,不用从前端请求绕一大圈
  3. 流式渲染
    React/Vue 都支持流式渲染 API,流式渲染模式下,框架每渲染完一部分 HTML 就会直接响应。
    由于 SSR 场景下页面已经填充好数据,越早返回数据浏览器就可以越早进行初次绘制,降低 FP 时间。
  4. 减少不必要的应用逻辑
    找到不需要在服务端执行的复杂的逻辑,处理到客户端再执行

7、优化应用的LCP

DNS prefetch
HTTP2 的 Server push

8、 优化应用的 CLS

CLS 相对而言是比较容易拿到优化效果的指标,
而且该指标在 Lab 评分规则中占比重非常大。
根据 CLS 算法,我们只需要保证元素被渲染到页面上之后位置
不再有大幅度的移动即可得到一个比较高的 CLS 分数。使用骨架屏,
SSR 等都是比较常见的 CLS 优化手段。

9、优化TTI

在页面完全加载之前,尽量少的产生 Long task,尽量快的拿到请求响应

什么指标值得我们关注

https://juejin.cn/post/6956583036133572639

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

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

相关文章

chatgpt赋能Python-python_bonjour

Python Bonjour&#xff1a; 通过Python实现Bonjour协议 介绍 Bonjour是苹果公司推出的一种新型、免配置的网络协议&#xff0c;它可以使局域网中的电脑、打印机、电话等各种设备自动发现及配置&#xff0c;从而促进了网络设备的普及。Python作为一种高效、简洁、易学的语言&…

【WSN覆盖】基于麻雀搜索算法的三维混合无线传感器网络覆盖优化 三维WSN覆盖空洞修复【Matlab代码#25】

文章目录 【可更换其他算法&#xff0c;获取资源请见文章第6节&#xff1a;资源获取】1. SSA算法2. 节点感知模型3. 三维混合WSN覆盖问题4. 部分代码展示5. 仿真结果展示6. 资源获取 【可更换其他算法&#xff0c;获取资源请见文章第6节&#xff1a;资源获取】 1. SSA算法 2. 节…

机器学习与深度学习——通过奇异值分解算法压缩图片

机器学习与深度学习——通过奇异值分解算法压缩图片 什么是奇异值分解&#xff1f; 奇异值分解&#xff08;Singular Value Decomposition&#xff0c;SVD&#xff09;是一种重要的线性代数方法&#xff0c;用于将一个矩阵分解成三个部分的乘积形式。它的应用非常广泛&#x…

Leecode98

leecode98 验证二叉搜索树 给定一个二叉树&#xff0c;判断其是否是一个有效的二叉搜索树。 假设一个二叉搜索树具有如下特征&#xff1a; 节点的左子树只包含小于当前节点的数。 节点的右子树只包含大于当前节点的数。 所有左子树和右子树自身必须也是二叉搜索树。 &#x1…

【Linux】shell编程—Here Document免交互

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、免交互概述二、免交互常规用法1.read 命令的读取2.wc -l 的内容行数统计3.passwd用户密码的修改4.cat 查看内容并输出到文件中5.cat 查看交互内容并输出到新的文…

Spring传播机制(七种)

一、概述 Spring在TransactionDefinition接口中规定了7种类型的事务传播行为。Propagation枚举则引用了这些类型&#xff0c;开发过程中我们一般直接用Propagation枚举。 1.1 Propagation源码 public enum Propagation {REQUIRED(0),SUPPORTS(1),MANDATORY(2),REQUIRES_NEW(…

redis源码浅析-ziplist实现

redis中的list是有多种实现的&#xff0c;其中一种是ziplist&#xff0c;其介绍如下 ziplist 是一个经过特殊编码的双向链表&#xff0c;旨在提高内存效率。 它存储字符串和整数值&#xff0c;其中整数被编码为实际整数而不是一系列字符。 它允许在 O(1) 时间内在列表的任一侧进…

戴尔 Dell Latitude E7480电脑 Hackintosh 黑苹果efi引导文件

原文来源于黑果魏叔官网&#xff0c;转载需注明出处。&#xff08;下载请直接百度黑果魏叔&#xff09; 硬件配置 硬件型号驱动情况 主板戴尔 Dell Latitude E7480 处理器Intel Core i7-7700U已驱动 内存8GB 2133MHz DDR4 * 2已驱动 硬盘Sandisk 1T M.2 NVMe SSD已驱动 显…

windows解决python安装django架构没有django-admin命令

目录 一.尝试安装与配置 1.直接pip命令安装 2.用pycharm测试 3.官网下包安装 二.解决 1.找到django安装的路径 2.配置系统变量 3.测试创建项目 3.1.执行访问页面 3.2.解决 3.3.继续测试 4.pycharm打开 一.尝试安装与配置 1.直接pip命令安装 pip install django dja…

chatgpt赋能Python-python_7

Python 7 - 探索最受欢迎的Python版本 如果你是一位Python开发人员&#xff0c;你就会知道Python 7是什么。Python 7是Python编程语言的第7个主要版本&#xff0c;它带来了许多新的功能和改进&#xff0c;包括内置类型注释、上下文变量、字节码优化和更多。 在本文中&#xf…

度小满科技金融迭代:普惠小微与技术创新并肩而行

2015年&#xff0c;深度贫困乡镇隘口镇推出“本土人才”政策,呼吁大学生人才下基层,助力乡村经济振兴工作。 叶茂的人生轨迹因此而发生改变。彼时&#xff0c;20多岁的叶茂果断辞去药材公司的高薪工作&#xff0c;开始了回乡种植黄精的创业路&#xff0c;并成功竞选东坪村村主任…

log4cpp的安装(vs/visual studio版)

log4cpp安装下载源visual studio安装方法 log4cpp安装 下载源 log4cpp visual studio安装方法 将下载好的压缩包解压缩后得到下列目录&#xff08;解压缩的文件夹最好放C盘&#xff0c;不然在编译阶段往往会出现链接不上的问题&#xff09; 找到mscv10文件夹内的mscv10.sl…

【概念篇】浅谈 AOP、OOP、DDD、IOC

前言 在招聘要求中&#xff0c;有没有经常看见&#xff0c;对AOP、OOP、DDD、IOC有一定的认识&#xff0c;能够自主开发模块&#xff0c;这一类的要求。听起来是不是挺高大上&#xff0c;然后百度一搜&#xff0c;给你出来一堆概念性的东西——结果就是&#xff0c;东西…

《LKD3粗读笔记》(14)块I/O层

什么是块设备&#xff1f; 系统中能够随机访问固定大小数据片的设备被称为块设备&#xff0c;这些数据片称作块&#xff0c;最常见的块设备是硬盘。什么是字符设备&#xff1f; 字符设备按照字符流的方法被有序访问&#xff0c;像串口和键盘就都属于字符设备。这两种设备的区别…

从零开始搭建 Lsky Pro 兰空图床

本文源码&#xff1a;https://github.com/chen2438/chenhaotian.top/tree/main/source/_posts/linux-app/lsky.md 在我的博客上查看&#xff1a;https://chenhaotian.top/2022/12/30/linux-app/lsky/ 从零开始搭建 Lsky Pro 兰空图床 官方教程 安装环境 使用OneinStack安装…

第五章 面向对象-8.enum 枚举

enum 枚举 枚举的实例对象是固定的&#xff0c;实例是自动new&#xff0c;每个枚举类会自动继承java.lang.Enum 抽象类 如何声明枚举&#xff1f; 所有枚举类都是java.lang.Enum的子类&#xff0c;无需用extends来继承&#xff0c;如下是枚举类拥有的常用方法 方法名称说明…

测试报告框架 —— Allure2测试报告

目录 Allure2测试报告 1、使用 Allure2 运行方式-Python 2、使用 Allure2 运行方式-Java 3、生成测试报告 4、Allure2 报告中添加用例标题 5、allure2报告中添加用例步骤 6、allure2报告中添加用例链接 7、allure2报告中添加用例分类 8、Allure2 报告中添加用例描述 …

【面试题】前端必修-浏览器的渲染原理

大厂面试题分享 面试题库 前后端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;前端面试题库 web前端面试题库 VS java后端面试题库大全 1.浏览器的渲染原理 #浏览器是如何渲染页面的 1.什么叫渲染 render 当我们输入一个url地址的…

新书上市 | 从大脑认知开始,全方面提高编程能力,助你摆脱“GPT焦虑症”

目录 一、ChatGPT火爆全网二、《程序员超强大脑》三、本书内容四、本书特色五、作译者简介1、费莉安赫尔曼斯&#xff08;Felienne Hermans&#xff09;2、蒋楠 大家好&#xff0c;我是哪吒。 &#x1f3c6;本文收录于&#xff0c;49天精通Java从入门到就业。 全网最细Java零…

程序人生-Hello’s P2P

摘要 本文讨论了与编程和软件开发相关的几个关键概念和过程。首先介绍了链接的概念和作用&#xff0c;它是将代码和数据片段组合成单一文件的过程&#xff0c;使得分离编译成为可能&#xff0c;从而可以更好地管理和修改模块。接下来探讨了进程的概念和作用&#xff0c;进程是正…