跳到主要内容
返回

前端性能优化-预备篇

说明前端性能优化应围绕用户可感知的延迟与卡顿展开,并系统介绍 LCP、INP、CLS 等核心指标。

前言

趁空闲时间又开了个新坑,记录下目前自己遇到过的一些前端性能优化相关经验总结

file

希望有朝一日我能把所有还在 draft 阶段的坑都填了

这次准备发一系列文档,预计在6月前完工。

因写内存泄漏文档时发现坑挖太大了不好填,于是这次改进为挖多个小坑一个个填

内存泄漏文档的坑也准备拆一下,不然填不动了,希望有朝一日能完工

何时应该考虑优化性能

性能优化的目标

先考虑这样的例子:玩游戏的时候掉帧,会让玩家很难受,而当开启显卡的帧生成功能时,尽管它实际上增加了输入和画面延迟,但玩家几乎感知不到,反而会感觉游戏的体验更流畅了。而帧生成做的事情,其实是将帧数提升到玩家的舒适范围内,并且保证玩家尽可能感知不到额外的输入延迟,对玩家而言就是游戏性能变得更优了。

类似地,当我们自己使用软件时,一般只有在出现明显卡顿或者延迟的时候才会感知到软件存在性能问题。

故性能优化的目标可以概括为:将延迟和卡顿降低到用户的可接受范围内。

优化的时机

先上结论:绝大部分情况下,只有出现性能瓶颈的时候才应该考虑优化性能。

可能有朋友会感到疑惑,难道性能不重要吗?

在软件开发领域有这么一句话:Make it work, Make it right, Make it fast.

个人认为这句话准确的描述了一个软件项目的完整研发周期。也解释了为什么优化性能的优先级没有我们想象的那么高。

性能优化的投入与回报类似一个对数曲线,越往后,付出的成本和回报就越不成正比。如何平衡软件性能与开发成本,通常是我们每个开发者都要面临的问题。

当然,如果你是个人开发者 or 技术爱好者,那么保证自己的产品在每个细节上都做到性能优秀可能更加适合。

但如果是一个全职开发者,并且公司是业务驱动而非技术驱动,那么保证自己可以快速实现功能可能是更重要的。

因此,在出现性能瓶颈,也就是用户能感知到卡顿或者延迟的时候再去考虑性能优化,是实际开发工作中的性价比之选。

常见前端性能指标

指标概览

让我们先来看一下目前在前端领域都有哪些常见的指标(留下印象即可):

大伙应该也猜到了,在实际开发中关注那么多指标是不现实的,所以我们需要了解哪些指标的优先级最高,需要重点关注

file

核心性能指标 - Core Web Vitals

下面的指标定义和图片资源都来自web.dev网站,博主只提炼了一些主要信息,感兴趣的读者可自行前往阅读

Core Web Vitals 是Google提出的用于衡量页面用户体验质量的核心性能指标,影响搜索引擎排名(SEO)。

其包含的指标有:LCP、INP、CLS,下面我们一起来详细了解下这些指标

LCP

定义

视口内可见的最大图片、文本或视频的渲染时间,用于衡量页面的加载性能

img

计算原理

示例:

img

img

INP

定义

通过观察用户访问网页期间发生的所有点击、点按和键盘互动的延迟时间,其中最长的时间报告为INP,用于评估网页对用户互动的总体响应情况

img

计算原理

img

为了更好地衡量互动量较高的网页的实际响应速度,计算时会忽略每 50 次互动中延迟最高的互动

与FID的区别

CLS

定义

相比前两个指标,CLS将会更复杂一点,但请放轻松&保持耐心,真正理解后会发现这个概念其实也很简单

CLS指页面生命周期内所有意外布局偏移的累积分数,用于评估页面的视觉稳定性

img

计算原理

基本公式

布局偏移分数(layout shift score)由一次布局偏移的**影响分数(impact fraction)和距离分数(distance fraction)**相乘得出

即layout shift score = impact fraction * distance fraction

影响分数

定义:偏移元素在视口中影响的可视区域比例

计算方式:影响分数 = 偏移前面积 ∪ 偏移后面积 / 视口总面积

示例:

img

在上图中,有一个元素在一个帧中占据了视口的一半。然后,在下一个画面中,该元素会向下移动视口高度的 25%。红色虚线矩形表示元素在两个帧中的可见区域的并集,在本例中,该区域占整个视口的 75%,因此其影响百分比为 0.75

距离分数

定义:偏移元素在视口中移动的最大相对距离(垂直或水平方向)

计算方式:距离分数 = 移动距离 / 视口对应方向尺寸(高度或宽度)

示例:

img

在上面的示例中,视口的最大尺寸是高度,并且不稳定的元素移动了视口高度的 25%,因此距离分数为 0.25

计算CLS

基于上面所说的内容,我们就可以计算CLS了

示例:

img

结语

作为系列的开篇,本文分享了对前端性能优化的目标和常见性能指标,也对Google研究出的核心性能指标做了介绍。

后面会基于如何优化核心性能指标进行更细节的分享,希望能写出更好的博客,与各位共勉~


分享这篇文章: