# 性能指标

# RAIL 性能模型

RAIL是Response,Animation,Idle和Load的首字母缩写,是一种由Google Chrome团队于2015年提出的性能模型,用于提升浏览器的用户体验和性能

RAIL模型的理念是以用户为中心,最终目标并不是让你的网站在任何特定设备上都能运行很快,而是使用户满意

Response

应该尽可能快速的响应用户的操作,应在在100ms以内响应用户输入

Animation

在展示动画的时候,每一帧应该以16ms进行渲染,这样可以保持动画效果的一致性,并且避免卡顿

Idle

当使用js主线程的时候,应该把任务划分到执行时间小于50ms的片段中去,这样可以释放线程以进行用户交互。50ms为单位是为了保证用户在发生操作的100ms内做出响应

要使网站响应迅速,动画流畅,通常都需要较长的处理时间,但以用户为中心来看待性能问题,就会发现并非所有工作都需要在响应和加载阶段完成,我们完全可以利用浏览器的空闲时间处理可延迟的任务,只要让用户感受不到延迟即可。利用空闲时间处理延迟可减少预加载的数据大小,以保证网站或应用快速完成加载

Load

应该在小于1s的时间内加载完成你的网站,并可以进行用户交互。根据网络条件和硬件的不同,用户对性能延迟的理解也有所不同,在3G网络需要花费更多的时间,5s是一个更现实的目标

# 重要的性能指标

FCP (First Contentful Paint)

首次内容绘制,浏览器首次绘制来自DOM的内容的时间,内容必须包括文本,图片,非白色的canvas或svg,也包括带有正在加载中的web字体文本。这是用户第一次看到的内容

FCP时间(秒) 颜色编码 FPC分数
0 - 2 绿色(快) 75 - 100
2 - 4 橙色(中等) 50 - 74
超过4 红色(慢) 0 - 49

LCP (Largest Contentful Paint)

最大内容绘制,可视区域中最大的内容元素呈现到屏幕上的时间,用以估算页面的主要内容对用户的可见时间。img图片,video元素的封面,通过url加载到的北京,文本节点等,为了提供更好的用户体验,网站应该在2.5s以内或者更短的时间最大内容绘制

LCP时间(秒) 颜色编码
0 - 2.5 绿色(快)
2.5 - 4 橙色(中等)
超过4 红色(慢)

FID (First Input Delay)

首次输入延迟,从用户第一次与页面进行交互到浏览器实际能够响应该交互的时间,输入延迟是因为浏览器的主线程正忙于做其他事情,所以不能响应用户,发生这种情况的一个常见原因是浏览器正忙于解析和执行应用程序加载的大量计算的JavaScript

FID时间(毫秒) 颜色编码
0 - 100 绿色(快)
100 - 300 橙色(中等)
超过300 红色(慢)

TTI (Time to Interactive)

网页第一次完全达到可交互状态的时间点,浏览器已经可以持续的响应用户的输入,完全达到可交互的状态的时间是在最后一个长任务完成的时间,并且在随后的5秒内网络和主线程是空闲的。从定义上来看,中文名称叫持续可交互时间或可流畅交互时间更合适

TTI时间(秒) 颜色编码
0 - 3.8 绿色(快)
3.9 - 7.3 橙色(中等)
超过7.3 红色(慢)

TBT (Total Block Time)

总阻塞时间,度量了FCP和TTI之间的总时间,在该时间范围内,主线程被阻塞足够长的时间以防止输入响应。只要存在长任务,该主线程就会被视为阻塞,该任务在主线程上运行超过50 毫秒。

线程阻塞是因为浏览器无法中断正在进行的任务,因此如果用户确实在较长的任务中间与页面进行交互,则浏览器必须等待任务完成才能响应。

TBT时间(毫秒) 颜色编码
0 - 300 绿色(快)
300 - 600 橙色(中等)
超过600 红色(慢)

CLS (Cumulative Layout Shift)

累计布局便宜,CLS会测量在页面整个生命周期中发生的每个意外的布局移位的所有单独布局移位分数的总和,他是一种保证页面的视觉稳定性从而提升用户体验的指标方案。

用人话来说就是当我们想点击页面中的某个元素的时候,突然布局变了,手指点到了其它位置。比如想点击页面的链接,突然出现了一个banner。这种情况可能是因为尺寸未知的图像或者视频。

CLS时间(毫秒) 颜色编码
0 - 0.1 绿色(快)
0.1 - 0.25 橙色(中等)
超过0.25 红色(慢)

# Web Vitals

这也是谷歌指定的web性能指标标准, 谷歌认为之前的标准太复杂,指标太多了,在2020年重新进行了梳理,简化到了三个。加载性能LCP,交互性FID,视觉稳定性CLS。只需要做好这三个,网站的性能基本上就可以了

  • 加载性能LCP(Largest Contentful Paint):可视区域中最大的内容元素呈现到屏幕上的时间,大致可以表示为页面全部加载完成时间

  • 交互性FID(First Input Delay):用户第一次与页面进行交互到浏览器实际能够响应该交互的时间

  • 视觉稳定性(CLS (Cumulative Layout Shift):发生的每个意外的布局移位的所有单独布局移位分数的总和

测量Web Vitals的工具有很多,比如Lighthouse, web-vitals, 浏览器插件web vitals。

Web-Vitals

// npm install web-vitals -g

import { getLCP, getFID, getCLS } from 'web-vitals';

getCLS(conole.log)
getFID(conole.log)
getCLS(conole.log)

浏览器插件

谷歌浏览器可以直接在插件市场中查找并且安装web vitals。安装完成之后浏览器的右上角会多出插件标志,点击就会显示页面的性能指标。

# 性能测试

性能检测是作为性能优化过程中的一环,他的目的通常是给后续优化工作提供指导方向,参考基线以及千户对比的依据。性能检测并不是一次性执行结束后就完成的工作,他会在检测,记录和改进的迭代过程中不断重复。来协助网站的性能优化不断接近期望的效果

# Lighthouse(灯塔)

Lighthouse是谷歌开发并开源的web性能测试工具,用于改进网络应用的质量,可以将其作为一个Chrome扩展程序运行,或从命令行运行。只需要为其提供一个需要审查的地址,Lighthouse就会对页面进行一连串的测试,生成一个有关页面性能的报告

在浏览器的调试工具中默认就存在lighthouse选项,只需要切换至lighthouse, 在右侧的选项区选中我们需要的选项。点击生成报告

# WebPageTest

在线web性能测试工具((www.webpagetest.org)[www.webpagetest.org]), 提供多地点测试。他只能测试已经发布了的网站。输入需要测试的网页地址,点击start test按钮就开始测试了,可以选择测试地理位置,测试的浏览器等。

前端性能优化指标 + 检测工具 (opens new window)