网站性能指标与测评工具
网站性能评估不能只看网络加载耗时。用户的真实感受还包括页面是否响应、交互是否流畅、动画是否顺滑。传统 load、DOMContentLoaded 只代表浏览器内部事件,不能直接当作用户体验分数。
W3C Web 性能标准指标
TTFB、FP、FCP、DOMContentLoaded、load 均归属 W3C Web Performance 系列规范(Navigation Timing、Paint Timing),浏览器通过原生 Performance API 对外暴露,适合线上 RUM(真实用户监控)采集。
基础诊断计时指标(Navigation Timing 规范)
这类指标偏向网络、文档生命周期诊断,不作为用户体验的核心评判标准。
- TTFB(Time to First Byte):请求发起,到收到服务器返回第一个字节;包含 DNS、TCP、SSL握手,反映服务器与网络响应速度。
- DCL(DOMContentLoaded):HTML文档解析完成触发,不等待图片、样式、字体等资源加载完成。
- Load(load事件):页面全部资源(图片、样式、脚本)全部加载完毕。
- FP(First Paint 首次绘制):浏览器第一次向屏幕绘制像素,可以只是背景色,不一定存在业务内容(Paint-Timing)。
- FCP(First Contentful Paint 首次内容绘制):浏览器第一次渲染DOM输出真实内容(文本、图片、SVG、Canvas),代表用户第一次看到页面内容,但不等于核心业务内容渲染完成(Paint-Timing)。
Core Web Vitals 核心 Web 指标(现代用户体验标准,RUM 首选)
W3C、Google 用户体验标准,2024 年 INP 正式替代 FID,是线上监控、SEO 评估的核心指标。
- LCP(Largest-Contentful-Paint 最大内容绘制):加载体验,视口内最大业务内容渲染完成时间,代表用户看到主要内容,理想阈值 ≤2.5s。
- INP(Interaction-to-Next-Paint 交互至下一绘制):交互体验,用户点击/输入,到浏览器完成下一帧绘制的延迟,理想阈值 ≤200ms。
- CLS(Cumulative-Layout-Shift 累积布局偏移):视觉稳定性,页面元素意外发生位移的总分,理想阈值 ≤0.1。
辅助诊断指标
- Long Task 长任务:主线程阻塞超过50ms JS任务,直接造成点击卡顿、动画掉帧,出自 Long-Tasks API,用于定位卡顿根因。
- TTI(Time to Interactive,可交互时间):不属于 W3C 正式标准。Lighthouse 10 起已从 Performance 得分中移除(权重归到 CLS),实验室更常用 TBT(Total Blocking Time)。不要用于线上 RUM 采集。
体验-指标对照表
| 用户体验问题 | 指标 |
|---|---|
| 请求有没有到达服务器 | TTFB |
| 页面画面是否开始输出 | FP、FCP |
| 页面核心内容是否出来 | LCP(Core Web Vitals) |
| 页面是否可交互 | 无正式 W3C 标准;实验室看 TBT,不要用 TTI 做线上埋点 |
| 交互是否流畅、无卡顿 | INP、Long Task、CLS |
采集说明:全部指标通过浏览器原生 PerformanceObserver API 获取;Google 提供轻量库 web-vitals,封装好RUM采集逻辑,可直接上报后端。
性能测评工具
性能工具分为在线SaaS平台、本地Chrome工具、命令行自动化工具。
工具本质是模拟浏览器访问页面,采集Performance API指标、做规则审计;工具输出属于实验室环境数据,不等同于真实线上用户RUM数据。
Lighthouse
核心:Chrome 内置开源性能审计工具,也是 PageSpeed Insights、GTmetrix 等平台的底层内核。
实现原理:
- 基于Chrome DevTools Protocol(CDP)驱动Chrome;
- 打开页面,应用指定视口、CPU/网络节流;
- 通过CDP采集Performance API、Trace追踪、资源请求日志;
- 运行上千条审计规则,输出五大维度报告:Performance、PWA、无障碍、最佳实践、SEO。
注意:Lighthouse 输出是实验室模拟数据,不能替代线上真实 RUM;TTI 已从 Lighthouse 10 的得分中移除,报告里以 FCP、LCP、TBT、CLS、Speed Index 为主。
使用方式
Chrome DevTools
- Chrome 打开页面 → F12 开发者工具 → Lighthouse 面板(Chrome 已内置,无需再装扩展);
- 勾选需要审计类别,勾选模拟移动设备、模拟节流;点击「生成报告」;
- 拿到可视化报告,点开每一项查看具体原因和优化建议。
命令行 lighthouse
npm install -g lighthouse
运行,输出json报告,可保存文件,供内部平台解析。
lighthouse https://xxx.com --view --output json --output-path=report.json --preset=mobile
CI中可以解析报告,对LCP、Lighthouse得分设置门禁,版本构建性能退化阻断合并。
Node.js编程调用
在Node脚本中直接引入lighthouse模块,搭配puppeteer控制浏览器,可自定义cookie、请求头、内网页面。适合搭建内部私有性能测试平台。
性能核心指标
| 指标 | 说明 |
|---|---|
| FCP 首次内容绘制 | 页面首次绘制文本/图片等DOM内容 |
| LCP 最大内容绘制 | Core Web Vitals核心,页面最大内容渲染时间 |
| TTI 可交互时间 | Lighthouse 10 起不再计入得分,不要作为线上指标 |
| Speed Index 速度指数 | 衡量首屏逐步渲染速度,数值越小越好 |
| TBT 总阻塞时间 | 实验室替代 TTI 的主线程阻塞指标,计入 Performance 得分 |
| INP | 交互响应延迟,RUM 中替代旧 FID |
PageSpeed Insights
地址:https://developers.google.com/speed/pagespeed/insights/
实现原理:
- 后端调用 Lighthouse 内核,使用受控的Chrome Headless无头浏览器实例访问目标网页;
- 模拟移动/桌面设备视口、网络节流;
- 采集Web Vitals等性能指标,同时执行一批预定义审计规则:资源体积、图片格式、JS未懒加载、未开启缓存等;
- 将原始指标、审计结果,换算成 0-100 的综合得分,输出优化建议链接。
如何落地使用:
- 网页直接使用:输入页面URL,选择移动端/桌面,直接在线查看报告,复制优化建议给到开发。
- API集成:提供官方API,可以在CI流水线调用,拿到JSON报告,做线上性能门禁。
GET https://www.googleapis.com/pagespeedonline/v5/runPagespeed?url=https://xxx.com&strategy=mobile
注意:API有调用配额,高频CI需要做缓存、配额管控。
适用场景:公网页面快速评测;SEO配套Core Web Vitals检查;CI做简单性能门禁。
局限:无法测内网、登录态页面;受Google服务器网络访问限制;不能自定义复杂网络节流规则。
GTmetrix
实现原理:
- 底层以 Lighthouse 为默认引擎(2020 年起替代 PageSpeed、YSlow);YSlow 仅作为账号里可开关的 Legacy Report,新项目按 Lighthouse 指标看即可;
- 在全球多地域节点启动 Chrome 无头浏览器,可选择不同测试地区、浏览器、网络节流;
- 采集页面全部资源 HAR 请求日志、性能指标;持久化历史数据,提供时序图表、告警。
如何落地使用:
- 网页端手动测试:输入URL,选择测试服务器地区、设备、网络;支持配置Cookie,可测试登录后页面;查看HAR瀑布图,定位慢请求。
- 定时监控(注册账号):设置每日/每周定期跑测试;配置告警阈值(LCP、总资源大小),指标异常通知;查看历史性能趋势,观察版本发布后性能退化。
- REST API自动化集成:通过API提交测试任务,轮询获取报告JSON;接入CI,或者内部性能平台。
注意:免费版API有额度,高频使用需要付费套餐。
适用场景:需要多地域测试;要分析完整网络HAR瀑布;需要历史性能趋势;需要测登录态页面。
局限:免费版并发、测试次数有限;国内访问海外节点网络波动会干扰测试结果。
自动化性能数据采集
线上业务需要采集真实用户性能数据(RUM),可以两种方案:
- 浏览器端:使用
web-vitals库,直接在用户浏览器采集指标上报服务端; - 测试环境:借助 Puppeteer 无头浏览器,模拟访问页面,读取浏览器性能指标入库做回归测试。
Puppeteer 采集示例
const browser = await puppeteer.launch({
devtools: true,
headless: false,
defaultViewport: {
width: 375,
height: 667
}
})
const page = await browser.newPage();
// 设置 Cookie,用于需要登录态的页面
await page.setCookie({
name: 'token',
value: '',
domain: '.abc.com',
path: '/',
expires: 1893456000000,
httpOnly: false,
secure: false,
sameSite: "Strict"
});
await page.goto('https://xxx.com');
// Navigation Timing Level 2,不要再用已废弃的 performance.timing
const nav = await page.evaluate(() => {
const entry = performance.getEntriesByType('navigation')[0];
return entry ? entry.toJSON() : null;
});
// 将 nav 存入数据库做统计
await browser.close();
Chrome 网络节流预设参考
测试弱网环境页面表现,可以使用下面的带宽、RTT配置。 | Preset | download(kb/s) | upload(kb/s) | RTT(ms) | | ---------- | -------------: | -----------: | ------: | | GPRS | 50 | 20 | 500 | | Regular 2G | 250 | 50 | 300 | | Good 2G | 450 | 150 | 150 | | Regular 3G | 750 | 250 | 100 | | Good 3G | 1000 | 750 | 40 | | Regular 4G | 4000 | 3000 | 20 | | DSL 2000 | 1000 | 5 | - | | WiFi 30000 | 150000 | 2 | - |
其他统计工具
- Google Analytics:用户行为、访问数据统计;
- Adobe Analytics(原 Omniture):商业级用户数据分析平台;
- web-vitals 库:Google 官方库,浏览器端采集 Core Web Vitals 真实用户指标。
前端性能优化方案
懒加载(减少初始JS体积)
把代码切割为 chunk,只有用到的时候才加载,降低首屏 JS 下载解析开销。
export default {
components: {
Abc: () => import('./abc.vue')
}
}
组件库按需引入
针对 UI 组件库,只打包用到的组件,剔除未使用模块,减少产物大小。Vue 2 时代常用 babel-plugin-component(如下);现行项目多用 unplugin-vue-components 或各库官方的按需插件。
{
"plugins": [
"transform-runtime",
[
"component",
[
{
"libraryName": "mint-ui",
"style": true
},
{
"libraryName": "bxs-ui-vue",
"libDir": "lib",
"style": "index.css"
}
]
]
]
}
webpack externals 外部扩展
第三方库不打入业务bundle,页面通过CDN脚本引入,构建时排除这些包,缩减打包体积。
<!-- html引入CDN -->
<script src="//assets.winbaoxian.com/vue/2.5.17/vue.min.js"></script>
// webpack配置
module.exports = {
externals: {
vue: 'Vue'
}
}
静态资源部署到 CDN
图片、js、css 等静态资源上传 CDN,利用 CDN 节点加速分发,降低源站压力。
实验室分数用来找瓶颈,线上 RUM(LCP、INP、CLS)才代表用户真实体验。优化优先砍首屏 JS、按需加载,再把静态资源放到 CDN。