性能优化总纲

本文仅论述优化的手段,不涉及执行这些操作的根因,后续空闲时在整理“为什么”。

一、性能指标

指标有很多,比如 lighthouse 中使用的指标有 FCP、LCP、TBT、CLS、Speed Index,这些是最终的性能评估指标。

性能优化方案落地时,主要参看的指标:

指标名词解释描述
DCL [DOMContentLoaded]DOM 解析结束时间HTML 文档被解析成 DOM 树并且所有的标签都已经可用,但是外部资源(如图像、样式表等)可能还没有加载完成。
FP [First Pain]首次绘制浏览器首次将像素渲染到屏幕上的时间点,即页面第一次有可见的内容呈现给用户。
FCP [First Content Pain]首次内容绘制浏览器首次将第一个有意义的内容(如文本、图像、SVG 等)呈现到屏幕上的时间点。
LOAD加载结束时间在整个页面及其所有资源(包括图像、样式表、脚本等)加载完成后触发。

(1)指标对应的值的获取

通过 Chrome 的 Performance 面板,可以看到大部分的值,这里说下如何通过 API 获取值。

1.1 DCL

console.time("DCL");
document.addEventListener("DOMContentLoaded", function (event) {console.timeEnd("DCL");
});

1.2 FP 与 FCP

const [fp, fcp] = performance.getEntriesByType("paint");const fpDuration = fp.startTime;
const fcpDuration = fcp.startTime;

1.3 Load

const entry = performance.getEntries()[0];
const loadDuration = entry.duration;

二、资源模块

针对静态资源保持一个大体的优化思路,即在当前优先处理与当前页面相关的资源。

(1)HTML 资源

下载过程中没有相关的处理

(2)CSS 资源

2.1 减少字节

  • CSS 简写。属性能够简写的,不要分开写
  • CSS 浅选择器。去除非必要的、详细的选择器,这是一个累活。

2.2 移除未使用的 CSS

一个复杂项目中可能会加载很多的 css 样式表,有些样式表不一定会被使用到,可以将这部分的样式去除。相关工具:

  • uncss

2.3 启用 GPU 渲染

针对变换、动画等场景,可以启用 GPU 渲染。方式:

  • will-change

2.4 @import 问题

避免@import,其弊端:

  • 阻塞页面加载。当使用@import 导入外部样式表时,浏览器会在解析到@import 规则时暂停页面渲染,并立即请求导入的样式表
  • 顺序依赖性。@import 导入的样式表必须在主样式表中等待导入样式表加载完毕后才能应用。
  • 额外的 HTTP 请求。每次使用@import 导入样式表时,浏览器都需要发起额外的 HTTP 请求来获取该样式表
  • 无法并行加载。由于@import 导入的样式表必须在主样式表中等待加载完毕后才能继续渲染,因此无法与主样式表并行加载。

(3)JS 资源

3.1 资源处理

压缩

压缩资源,将多余的换行符、多余的打印等去除;

丑化

丑化资源,将代码中变量名、函数名等替换为简短的、难以阅读的代码。

分包

当个 JS 文件交大时,尝试执行分包处理。主流的构建工具都包含对应的处理方式:

  • webpack
    • dll。将第三方库按照一个的规则抽成一个或多个文件。
    • optimization
      • externals。第三方库,以 umd 的方式引入工程。打包时不参与打包
      • splitChunks。按照一定的规则将包模块进行拆分。
  • rollup
    • manualChunks。按照一定的规则将包模块进行拆分。

3.2 资源下载

  • async。异步加载资源,下载完成后立即执行脚本
  • defer。异步加载资源,在 load 事件时执行脚本
  • preload。提前加载资源
  • prefetch。空闲时加载下一个页面需要使用的资源

(4)图片资源

4.1 图标

有段时间,雪碧图是一个很流行的图标整合方式。到了现在这个阶段,字体图标是一个更好的方案。比如:阿里字体图

4.2 格式选择

常用的图片格式有 png、jpg、svg、webp。图片可以按照多个维度进行划分,如下:

  • 无损图和有损图
  • 光栅图和矢量图

WebP有 google 开发,旨在提供更高的压缩率和更高的图像质量,以替代传统的 JPEG、PNG 和 GIF 格式。WebP格式的特性:

  • 支持有损压缩和无损压缩
  • 支持透明色
  • 支持动态图
  • 压缩率更高

推荐使用WebP格式,主流浏览器厂商都已支持。

4.3 回退写法

为了保险起见,可以采用<picture>标签的回退语法确保正常显示。

<picture><source srcset="image.webp" type="image/webp" /><source srcset="image.jpg" type="image/jpeg" /><img src="image.jpg" alt="图像" />
</picture>

三、预加载

预加载分为几种类型,如:

(1)网络处理

dns-prefetch

浏览器在用户浏览页面时,在后台运行 DNS 的解析

<link rel="dns-prefetch" href="//fonts.googleapis.com" />

preconnect

允许浏览器在一个 HTTP 请求正式发给服务器前预先执行一些操作,这包括 DNS 解析,TLS 协商,TCP 握手,这消除了往返延迟并为用户节省了时间。

<link href="https://cdn.domain.com" rel="preconnect" crossorigin />

(2)资源预加载

在浏览器空闲时,加载站点将来可能用到的资源。

<!-- 图片 -->
<link rel="prefetch" href="/uploads/images/pic.png" />
<!-- 样式表 -->
<link rel="preload" href="styles.css" as="style" />
<!-- 脚本 -->
<link rel="preload" href="jQuery.js" as="javascript" />

四、懒加载

(1)图片懒加载

当资源出现在可视区时,再加载资源。实现方式,基于IntersectionObserve + src 替换的思路实现。

(2)路由懒加载

现代工程,大多是 SPA 工程,路由是有前端控制,当路由变化时再加载对应的资源很有必要。

2.1 Vue 工程

const Home = () => import("./components/Home.vue");
const About = () => import("./components/About.vue");const routes = [{ path: "/", component: Home },{ path: "/about", component: About },
];const router = new VueRouter({routes,
});

2.2 React 工程

const Home = React.lazy(() => import("./components/Home"));
const About = React.lazy(() => import("./components/About"));function App() {return (<Router><Suspense fallback={<div>Loading...</div>}><Switch><Route exact path="/" component={Home} /><Route path="/about" component={About} /></Switch></Suspense></Router>);
}export default App;

五、网络模块

(1)CDN

启用 CDN 网络,减少资源的加载时长。比如:腾讯桶

(2)压缩

请求传输的压缩算法,常用的有:

  • GZIP。一种常用的压缩算法,它基于 DEFLATE 算法
  • Brotli。由谷歌开发,与 GZIP 和 Deflate 相比,Brotli 具有更高的压缩率。

备注:

存在无损的 PNG 资源时,不要启用 GZIP。否则会起到反效果,导致压缩后的文件更大

(3)HTTP

升级为 HTTP/2,好处:

  • 提供成本更低的请求
    • 一套新的传输体系。连接->流->消息->帧
    • HTTP/2,一个连接,处理多个请求
  • 头部压缩。
    • 采用索引的思路,对相同的 header 值只用引用
  • 服务器推送

六、总结

性能优化,名词高大上,真正落地时会发现都是些基本功。

方法很简单,重要的是要知道为什么要这么做,空闲时再聊这块。

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

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

相关文章

3D测量之圆孔测量 拟合圆 点云变换

0. 效果展示 1. 圆孔测量介绍 此文中的圆孔测量是一项3D视觉技术,旨在精确测量物体表面上的圆孔的直径和中心坐标。通过使用高精度3D相机(线激光轮廓仪或结构体等)采集原始点云数据,通过3D视觉算法能够快速、准确地分析物体上的圆孔特征,为制造和工程领域提供了强大的测量…

AI学习路线

目前跟B站刘二大人老师学到了CNN&#xff0c;对深度学习有了一定的了解和认识&#xff0c;但是还不够深入&#xff0c;之前直接上李沐老师的视频太顶了555&#xff0c;不过自己基础确实不太行(╥╯^╰╥) 在B站看到了一位up分享的学习路线&#xff0c;感觉很好&#xff01; 分…

Android-Framework 禁止状态栏下拉

一、环境 高通865 Android 10 二、使用情景 在Launcher 桌面以及应用内&#xff0c;禁止状态栏下拉 三、代码实现 1、应用内禁止状态栏下拉 frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java -230,8 230,10 public…

系列二、Spring IOC

一、什么是IOC&#xff1f;有什么作用&#xff1f;优点是什么&#xff1f; IOC是控制反转的意思&#xff0c;即将创建对象的控制权交给了Spring的IOC&#xff0c;以前是由程序员自己去创建控制对象&#xff0c;现在交由Spring的IOC去创建控制&#xff0c;如果要去使用对象&…

VUE 集成 Mockjs

一、集成方式 在项目目录中执行以下命令&#xff1a; npm i -D mockjs二、配置 &#xff08;1&#xff09;在项目src目录下创建mock目录&#xff0c;并创建index.js文件&#xff0c;在index.js文件中添加以下代码&#xff1a; import Mock from mockjs// 配置需要mock的url…

STM32+摁键与定时器实现Led灯控制(中断)

中断作为单片机开发必须掌握的内容&#xff0c;它能够在不搭载操作系统的情况下让我们体验多任务处理的快感&#xff0c;保证了高优先级任务的实时性&#xff0c;同时系统中断也能够提供给用户在核心发生错误之后进行处理的机会。STM32F103系列单片机中断非常强大&#xff0c;每…

GaussDB数据库管理系统介绍

1.GaussDB的发展 2.GaussDB的生态 内部&#xff1a; 云化自动化方案。通过数据库运行基础设施的云化将DBA(数据库管理员)和运维人员的日常工作 自动化。外部&#xff1a; 采用与数据库周边生态伙伴对接与认证的生态连接融合方案&#xff0c;解决开发者/DBA难获取、应用难对接等…

[linux] 怎么批量kill掉挂载运行python 某个.py文件的端口

kill $(ps aux | grep python tools/token_raw_data_for_dsw.py | grep -v grep | awk {print $2}) 使用一系列的命令来查找并终止正在运行的名为"python main.py"的进程。 具体的步骤如下&#xff1a; ps aux命令用于列出当前正在运行的所有进程。grep python ma…

VR虚拟展厅的亮点是什么?有哪些应用?

传统展厅主要是以静态陈列的形式来传达内容&#xff0c;而展示形式则有图片、视频等&#xff0c;虽然视频包含内容多&#xff0c;但是总体具有一定的局限性&#xff0c;客户体验感也较差&#xff0c;往往不能深入了解细节。随着VR技术越来越成熟&#xff0c;VR技术的广泛应用&a…

PHP基础学习

PHP是什么&#xff1f; PHP&#xff08;全称&#xff1a;PHP&#xff1a;Hypertext Preprocessor&#xff0c;即"PHP&#xff1a;超文本预处理器"&#xff09;是一种通用开源脚本语言。PHP 脚本在服务器上执行。PHP 可免费下载使用。 基础的PHP语法 PHP 脚本可以放…

【谢希尔 计算机网络】第4章 网络层

目录 网络层 网络层的几个重要概念 网络层提供的两种服务 网络层的两个层面 网际协议 IP 虚拟互连网络 IP 地址 IP 地址与 MAC 地址 地址解析协议 ARP IP 数据报的格式 IP 层转发分组的过程 基于终点的转发 最长前缀匹配 使用二叉线索查找转发 网际控制报文协议…

2023年中国互联网视听平台发展趋势分析:未来增速将从2023年开始缓慢提升[图]

互联网视听平台是指基于互联网技术&#xff0c;提供包括音频、影视、综艺节目、直播、短视频等内容的数字化传播平台。互联网视听平台通过电脑端、移动端等多种终端提供在线点播、直播、互动等服务&#xff0c;具有内容丰富、便捷高效、交互性强等特点&#xff0c;是大众获取娱…

js逆向第一课 密码学介绍

什么是密码学&#xff1f; 密码学&#xff08;Cryptology&#xff09;是一种用来混淆的技术,它希望将正常的、可识别的信息转变为无法识别的信息。 目前密码学的研究&#xff0c;一种是偏应用&#xff0c;把现有的&#xff0c;别人研究出来的密码学算法&#xff0c;放在一个合…

C语言用awtk开发界面访问http接口

AWTK全称为Toolkit AnyWhere&#xff0c;是ZLG倾心打造的一套基于C语言开发的GUI框架。旨在为用户提供一个功能强大、高效可靠、简单易用、可轻松做出炫酷效果的GUI引擎&#xff0c;并支持跨平台同步开发&#xff0c;一次编程&#xff0c;终生使用。 1. 初识AWTK | AWStudio社区…

react中hooks闭包

import React, { useState } from react;function Counter() {const [count, setCount] useState(0);return (<div><p>Count: {count}</p><button onClick{() > setCount(count 1)}>Increment</button></div>); }在上面的 React 组件…

常见的Elasticsearch操作

在Elasticsearch中&#xff0c;增删改查操作具有明显的标识&#xff0c;通常使用HTTP方法和URI来表示不同的操作类型。以下是一些常见的Elasticsearch操作及其标识&#xff1a; 增&#xff08;Create/Index&#xff09;&#xff1a; HTTP方法&#xff1a; 通常使用PUT或POST方法…

2023年中国调速器产量、销量及市场规模分析[图]

调速器行业是指生产、销售和维修各种调速器设备的行业。调速器是一种能够改变机械传动系统输出转速的装置&#xff0c;通过调整输入和输出的转速比来实现转速调节的功能。 调速器行业分类 资料来源&#xff1a;共研产业咨询&#xff08;共研网&#xff09; 随着工业自动化程度…

CentOS | 添加普通用户并授权sudo

sudo -i adduser peter passwd peter whereis sudoers nano /etc/sudoers添加一行新用户到root组 ## Allow root to run any commands anywhere root ALL(ALL) ALL peter ALL(ALL) ALL如果提升权限后无法cd到其他目录等&#xff0c;修改 /etc/passwd 文件&…

海外跨境商城电商源码-进出口电商平台网站-多语言多商户多货币平台

一、海外跨境商城电商源码简介 海外跨境电商已成为全球经济发展的重要推动力。而海外跨境商城电商源码则是实现全球化电商的关键工具。本文将详细介绍海外跨境商城电商源码及其相关内容。 二、如何理解海外跨境商城电商源码 海外跨境商城电商源码是指一套已经开发好并可直接应用…

ZKP6.2 Discrete-log-based Polynomial Commitments (KZG10)

ZKP学习笔记 ZK-Learning MOOC课程笔记 Lecture 6: Discrete-log-based Polynomial Commitments (Yupeng Zhang) 6.2 KZG polynomial commitment and its variants KZG: [Kate-Zaverucha-Goldberg 2010]Procedure Soundness: q-Strong Bilinear Diffie-Hellman (q-SBDH) a…