一. 前言
Web
性能优化是前端领域重要的技术问题,关乎用户体验,好的用户体验能够增加用户粘性。本文将会围绕性能优化指标讨论如何做好性能优化。
二. 性能指标
2.1 TTFB
TTFB
即首个字节返回时间(Time To First Byte
),时间越短意味着请求响应越快。低于800ms
代表良好,800ms
到1800ms
之间代表待改善,1800ms
以上代表差。
以下是优化该性能指标的常见方法:
CDN
- 压缩算法
HTTP/2
或HTTP/3
HTTP
缓存策略- 减少重定向
2.2 LCP
LCP
即首次绘制内容时间(First Contentful Paint
),时间越短意味着页面白屏时间越短。低于1.8s
代表良好,1.8s
到3s
之间代表待改善,3s
以上代表差。
首先我们要知道浏览器解析渲染HTML
文档流程,即解析HTML
生成DOM
树,解析CSS
生成CSSOM
树,然后合成Render Tree
,再进行布局绘制,生成合成图,最终绘制到页面上展示。
其中我们要注意CSS
和Javascript
都会阻塞Render Tree
的生成,所以优化好CSS
和Javascript
解析执行逻辑至关重要。
以下是优化该性能指标的常见方法:
- 服务端流式渲染
- 内联关键
CSS
- 减少使用
CSS @import
Javascript
脚本添加async
或defer
属性
2.3 LCP
LCP
即最大绘制内容时间(Largest Contentful Paint
)。低于2.5s
代表良好,2.5s
到4s
之间代表待改善,4s
以上代表差。
以下是优化该性能指标的常见方法:
- 减少资源加载时延,可以使用资源预抓取,如
prefetch
/preload
- 使用现代图片格式,如
AVIF
/WebP
- 雪碧图
- 图片考虑使用
base64
- 字体文件使用
woff2
格式 - 代码压缩,如
HTML
/CSS
/JS
- 图片压缩
- 去除无用代码,如
Tree Shaking
- 代码分割,如
webpack SplitChunksPlugin
- 动态加载,如
webpack import()
2.4 CLS
CLS
即累积布局偏移(Cumulative Layout Shift
)。低于0.1s
代表良好,0.1s
到0.25s
之间代表待改善,0.25s
以上代表差。
以下是优化该性能指标的常见方法:
- 图片预设宽高
- 设置
font-display
- 使用
transform
2.5 INP
INP
即下次渲染可交互时间(Interaction Next Paint
)。低于200ms
代表良好,200ms
到500ms
之间代表待改善,500ms
以上代表差。
以下是优化该性能指标的常见方法:
- 优化长任务,如使用
WebWorker
、requestAnimationFrame
或scheduler.yield()
- 减少
DOM
树大小,如虚拟列表 - 使用节流防抖
- 减少访问昂贵属性数据或方法,如
offsetWidth
或getBoundingClientRect
- 减少使用复杂选择器
三. 性能分析
3.1 web-vitals
web-vitals
是Google
维护的npm
包,提供了常见性能指标的处理方法,支持业务自定义收集处理性能指标数据。
import { onLCP } from 'web-vitals'
onLCP(console.log)
3.2 lighthouse-ci
可以集成到CI/CD
流程中,自动化输出性能报告。