Web性能指标模型
一、RAIL 模型
RAIL 是 Response、Animation、Idle 和 Load 的首字母缩写,是一种由 Google Chrome 团队于 2015 年提出的性能模型,用于提升浏览器内的用户体验和性能。
- Response(响应):在 内处理事件
目标:在 100 ms内完成由用户输入发起的转换,让用户感觉交互是即时的。
- Animatio(动画): 在 内生成一帧,目的为流畅的视觉效果
在 10 毫秒或更短的时间内生成动画的每一帧。从技术上来讲,每帧的最大预算为 16 ms(1000 ms/每秒 60 帧≈16 ms),但是,浏览器需要大约 6 ms速来渲染一帧,因此,准则为每帧 10ms。 - Idle(空闲):最大限度增加空闲时间
最大限度增加空闲时间以提高页面在 50 ms内响应用户输入的几率 - Load(加载):在5s内交付并实现可交互
目前,对于,在使用速度较慢 3G 连接的中端移动设备上,理想的目标是在 或更短的事件内实现交互
对于后续加载,理想的目标是在 内加载页面。
二、基于用户体验的性能指标
基于用户体验的核心指标 是 Google 在 web.dev 提出的
1. FCP (First Contentful Paint, 首次内容绘制)
含义
首次内容绘制 (FCP) 指标测量页面从开始加载到页面内容的任何部分在屏幕上完成渲染的时间。对于该指标,"内容"指的是文本、图像(包括背景图像)、
指标
测量方式
- web-vitals
import {getFCP} from 'web-vitals';
// 当 FCP 可用时立即进行测量和记录。
getFCP(console.log);
- lighthouse
- chrome 开发者工具
优化方案 ☞
- 消除阻塞渲染的资源
- 缩小 CSS
- 移除未使用的 CSS
- 预连接到所需的来源
- 减少服务器响应时间 (TTFB)
- 避免多个页面重定向
- 预加载关键请求
- 避免巨大的网络负载
- 使用高效的缓存策略服务静态资产
- 避免 DOM 过大
- 最小化关键请求深度
- 确保文本在网页字体加载期间保持可见
2. LCP (Largest Contentful Paint, 最大内容绘制)
含义
最大内容绘制 (LCP) 指标会根据页面首次开始加载的时间点来报告可视区域内可见的最大图像或文本块完成渲染的相对时间。
指标
测量方法
import {getLCP} from 'web-vitals';
// 当 LCP 可用时立即进行测量和记录。
getLCP(console.log);
影响因素
- 的服务器响应速度
- JavaScript 和 CSS 渲染阻塞
- 资源加载时间
- 客户端渲染
优化方案☞
- 使用 PRPL 模式做到即时加载
- 优化关键渲染路径
- 优化您的 CSS
- 优化您的图像
- 优化网页字体
- 优化您的 JavaScript(针对客户端渲染的网站)
3. FID (First Input Delay,首次输入延迟)
含义
FID 测量从用户第一次与页面交互(例如当他们单击链接、点按按钮或使用由 JavaScript 驱动的自定义控件)直到浏览器对交互作出响应,并实际能够开始处理事件处理程序所经过的时间。
- 上方的可视化图表中显示的是一个页面,该页面正在发出数个网络请求来获取资源(多为 CSS 和 JS 文件),这些资源下载完毕后,会在主线程上进行处理。这就导致主线程会阶段性地处于忙碌状态(在图中表示为米黄色任务块)
- 较长的首次输入延迟通常发生在首次内容绘制 (FCP)和Time to Interactive 可交互时间 (TTI)之间,因为在此期间,页面已经渲染出部分内容,但交互性还尚不可靠。
- 如果用户在最长的任务刚开始时就尝试与页面进行交互,因为输入发生在浏览器正在运行任务的过程中,所以浏览器必须等到任务完成后才能对输入作出响应。浏览器必须等待的这段时间就是这位用户在该页面上体验到的 FID 值。
指标
测量方法
import {getFID} from 'web-vitals';
// 当 FID 可用时立即进行测量和记录。
getFID(console.log);
优化方案☞
- 减少第三方代码的影响
- 减少 JavaScript 执行时间
- 最小化主线程工作
- 保持较低的请求数和较小的传输大小
4. TTI (Time to Interactive, 可交互时间)
含义
TTI 指标测量页面从开始加载到主要子资源完成渲染,并能够快速、可靠地响应用户输入所需的时间
- ① 先进行First Contentful Paint 首次内容绘制 (FCP)。
- ② 沿时间轴正向搜索时长至少为 5 秒的安静窗口,其中,安静窗口的定义为:没有长任务且不超过两个正在处理的网络 GET 请求。
- ③ 沿时间轴反向搜索安静窗口之前的最后一个长任务,如果没有找到长任务,则在 FCP 步骤停止执行。
- ④ TTI 是安静窗口之前最后一个长任务的结束时间(如果没有找到长任务,则与 FCP 值相同)。
指标☞
TTI指标(单位:秒) | 颜色编码 |
---|---|
0-3.8 | 绿色(快速) |
3.9-7.3 | 橙色(中等) |
>7.3 | 红色(慢) |
优化方案
- 缩小 JavaScript
- 预连接到所需的来源
- 预加载关键请求
- 减少第三方代码的影响
- 最小化关键请求深度
- 减少 JavaScript 执行时间
- 最小化主线程工作
- 保持较低的请求数和较小的传输大小
5. TBT (Total Blocking Time, 总阻塞时间)
含义
总阻塞时间 (TBT) 指标测量First Contentful Paint 首次内容绘制 (FCP)与Time to Interactive 可交互时间 (TTI)之间的总时间,这期间,主线程被阻塞的时间过长,无法作出输入响应。
长任务:在主线程上运行超过 50 ms的任务。
虽然在主线程上运行任务的总时间为 560(250+90+35+30+155 = 560) 毫秒,但其中只有 345(200+40+105 = 345) 毫秒被视为阻塞时间
指标☞
TBT指标(单位:毫秒) | 颜色编码 |
---|---|
0-200 | 绿色(快速) |
200-600 | 橙色(中等) |
>600 | 红色(慢) |
优化方案
- 减少第三方代码的影响
- 减少 JavaScript 执行时间
- 最小化主线程工作
- 保持较低的请求数和较小的传输大小
6. CLS (Cumulative layout shift, 累计布局偏移)
含义
测量页面在开始加载和其生命周期状态变为隐藏期间发生的所有意外布局偏移的累积分数。
每当一个可见元素的位置从一个已渲染帧变更到下一个已渲染帧时,就发生了布局偏移。
指标
布局偏移分数 = 影响分数 * 距离分数
- 影响分数是0.75(红色虚线矩形框表示两帧中元素的可见区域集合,在本示例中,该集合占总可视区域的 75%,因此其影响分数为0.75 。)
- 距离分数是0.25 (最大的可视区域尺寸维度是高度,不稳定元素的位移距离为可视区域高度的 25%,因此距离分数为 0.25)
- 所以布局偏移分数是0.75 * 0.25 = 0.1875 。
测量方法
import {getCLS} from 'web-vitals';
// 在所有需要汇报 CLS 的情况下
// 对其进行测量和记录。
getCLS(console.log);
优化方案☞
- 始终在您的图像和视频元素上包含尺寸属性,或者通过使用CSS 长宽比容器之类的方式预留所需的空间。
- 除非是对用户交互做出响应,否则切勿在现有内容的上方插入内容。
- 首选转换动画,而不是触发布局偏移的属性动画
7. SI
含义
指标
测量方法
优化方案
三、Web vitals
Web Vitals,即 Google 给的定义是一个良好网站的基本指标(Essential metrics for a healthy site)
Chorme network下Finish、DOMContentLoaded, Load参数含义
- Finish: 页面上所有 http 请求发送到响应完成的时间。如果页面加载完后,触发了http请求,那么该时间会变更。
- DOMContentLoaded:DOM 树构建完成。即 HTML 页面由上向下解析 HTML 结构到末尾的封闭标签·