性能不是"锦上添花",而是"核心业务属性"。Google 的研究数据表明,页面加载时间每增加 1 秒,用户转化率可能下降 7%;核心网页指标(Core Web Vitals)已是搜索引擎的排名依据。性能优化不再是一个"有空再优化"的锦上添花动作,而是关乎 SEO 排名、用户留存和转化率的核心工程能力。本文从性能优化的核心指标体系出发,系统讲解加载性能、运行时性能和视觉稳定性三个维度的优化策略,并给出性能预算和监控的落地实践,帮你建立一套"可衡量、可追踪、可执行"的全链路性能优化体系。
一、2025 年关键性能指标体系
1.1 核心 Web 指标(Core Web Vitals)
2025 年,Core Web Vitals 仍是应用最广泛的性能标准,因为它们将技术指标映射到真实用户感知。以下是最新阈值:

按设备/网络类型细分监控:只看平均值会掩盖真实用户的极端体验。建议按设备(手机/平板/桌面)和网络类型(4G/5G/WiFi)细分百分位数据。
1.2 测试方式:Lab + Field 双轨制

二、加载性能优化:让页面"快"在起点
2.1 资源压缩与合并
JS/CSS 压缩:
使用 Terser 压缩 JS 代码(移除注释、空格、未使用变量)
使用 cssnano 压缩 CSS 代码
配合 Tree-Shaking(Webpack/Rollup 内置功能)剔除未使用代码
图片优化:
优先使用 WebP/AVIF 格式(比 JPEG 小 25%-50%)
使用 srcset 和 sizes 属性实现响应式图片加载
结合 sharp 工具批量压缩图片
2.2 懒加载
图片懒加载:使用原生 loading="lazy" 属性(兼容性已覆盖 95% 以上浏览器):
html
<img src="below-the-fold.jpg" loading="lazy" alt="懒加载图片" width="800" height="600">
组件懒加载:在 Vue/React 中使用动态导入(Dynamic Import):
typescript
// React 路由懒加载
import { lazy, Suspense } from 'react';
const Home = lazy(() => import('./Home'));
function App() {
return (
<Suspense fallback={<div>Loading...</div>}>
<Home />
</Suspense>
);
}
2.3 缓存策略
HTTP 缓存:静态资源(JS/CSS/图片)设置长期缓存(max-age=31536000)
内容哈希:配合 contenthash 实现"缓存更新"
关键资源预加载:使用 提前加载 LCP 所需资源
三、运行时性能优化:从"流畅"到"丝滑"
3.1 INP 优化:保证交互响应性
INP(Interaction to Next Paint)自 2024 年成为 Core Web Vitals 指标以来,其重要性持续上升。优化 INP 的核心原则只有一个:保持主线程的响应能力,通过"让出(Yielding)"来避免长时间任务的阻塞。
优化策略:
识别并减少输入延迟:减少主线程上的长任务(> 50ms)
优化事件回调:避免在事件回调中执行重量级操作
避免布局抖动:减少强制同步布局(Forced Synchronous Layout)
最大限度地减小 DOM 大小:DOM 越大,交互处理越慢
💡 实战案例:金融科技公司 QuintoAndar 将 INP 缩短了 80%,使转化次数同比增长了 36%。
3.2 长任务拆分(Time Slicing)
将耗时超过 50ms 的长任务拆分为多个小任务,使用 setTimeout、requestIdleCallback 或 React 的 useDeferredValue / useTransition。
四、视觉稳定性:CLS 优化
CLS 衡量页面的视觉稳定性。为了提供良好的用户体验,网站应尽量确保至少 75% 的网页访问的 CLS 不高于 0.1。
CLS 优化策略:

五、性能预算:把性能目标变成工程红线
性能预算(Performance Budget) 将模糊的目标(如"让它更快")转化为具体、可衡量的指标(如"bundle 保持在 200KB 以下"、"LCP 低于 2.5 秒")。
5.1 设定性能预算
推荐的初始预算:
Bundle 体积:< 200KB(gzipped 主 bundle)
初始加载总大小:< 500KB
Core Web Vitals:LCP < 2.5s,INP < 200ms,CLS < 0.1
5.2 在构建工具中检测
Webpack:使用 webpack-bundle-analyzer 分析体积,配合 size-limit 或 bundlesize 在 CI 中阻断超标
Vite:使用 vite-plugin-bundle-analyzer 或 rollup-plugin-visualizer
CI 集成:超出预算即构建失败,让性能问题在 PR 阶段被发现
六、性能监控体系
6.1 RUM 采集示例
使用 web-vitals 库采集真实用户性能数据:
html
<script type="module">
import { onLCP, onINP, onCLS } from 'https://unpkg.com/web-vitals@4/dist/web-vitals.attribution.js';
const send = (name, value, id) => {
navigator.sendBeacon?.('/rum', JSON.stringify({
name, value, id, url: location.pathname
})) || fetch('/rum', {
method: 'POST',
keepalive: true,
body: JSON.stringify({ name, value, id, url: location.pathname })
});
};
onLCP(({ value, id }) => send('LCP', value, id));
onINP(({ value, id }) => send('INP', value, id));
onCLS(({ value, id }) => send('CLS', value, id));
</script>
6.2 可复用现有工具栈
将性能数据接入现有监控体系:GA4、Sentry、Datadog、Elastic,或自建轻量接口接收数据。
七、小结
全链路性能优化体系:
指标体系:Core Web Vitals(LCP/INP/CLS)+ TTFB,按设备/网络细分监控
加载性能:资源压缩(Terser/cssnano)、图片优化(WebP/AVIF)、懒加载、HTTP 缓存、Tree-Shaking
运行时性能:INP 优化(保持主线程响应能力)、长任务拆分、减少 DOM 大小
视觉稳定性:CLS 优化(图片宽高、动态内容占位、字体加载优化、aspect-ratio)
性能预算:在构建工具中设定红线,CI 中阻断超标
监控体系:Lab 测试 + Field RUM 双轨制