每一毫秒都重要
研究表明,页面加载时间每增加 100 毫秒,转化率就会下降 1%。3 秒后,53% 的用户会放弃访问。在移动设备上,用户对加载速度更加敏感。Web 性能优化不仅仅是技术问题,更是直接影响用户体验和业务成果的关键因素。
Web 性能优化的目标是:让页面尽可能快地展示有用内容,并保持流畅的交互体验。
核心性能指标
Google 提出了 Core Web Vitals 作为衡量 Web 性能的标准:
LCP
最大内容绘制 页面主要内容加载完成时间 目标: < 2.5 秒
FID
首次输入延迟 用户首次交互到响应的时间 目标: < 100 毫秒
CLS
累积布局偏移 页面内容意外移动的程度 目标: < 0.1
FCP
首次内容绘制 首次渲染内容的时间 目标: < 1.8 秒
LCP
最大内容绘制 页面主要内容加载完成时间 目标: < 2.5 秒
TTI
可交互时间 页面完全可交互的时间 目标: < 3.8 秒
资源加载优化
优化资源的加载顺序和方式是性能提升的关键:
// 动态导入
const module = await import('./heavy-module.js');
// 路由懒加载
const Home = () => import('./Home.vue');
<!-- 图片延迟加载 -->
<img src="image.jpg"
loading="lazy"
alt="描述">
<!-- iframe 延迟加载 -->
<iframe src="video.html"
loading="lazy"></iframe>
<!-- DNS 预解析 -->
<link rel="dns-prefetch"
href="https://cdn.example.com">
<!-- 预连接 -->
<link rel="preconnect"
href="https://fonts.googleapis.com">
<!-- 预加载 -->
<link rel="preload"
href="critical.css"
as="style">
图片优化
图片通常是网页最大的资源,优化图片能带来显著的性能提升:
<!-- 使用现代格式 -->
<picture>
<source srcset="image.webp"
type="image/webp">
<img src="image.jpg"
alt="描述">
</picture>
<!-- 响应式图片 -->
<img src="small.jpg"
srcset="small.jpg 640w,
medium.jpg 1024w,
large.jpg 1440w"
sizes="(max-width: 640px) 100vw,
(max-width: 1024px) 50vw,
33vw"
alt="描述">
<!-- 懒加载 -->
<img src="placeholder.jpg"
data-src="image.jpg"
loading="lazy"
alt="描述">
CSS 优化
优化 CSS 的加载和使用:
/* 内联关键 CSS */
<head>
<style>
/* 首屏关键样式 */
.header { ... }
.hero { ... }
</style>
<link rel="stylesheet"
href="main.css">
</head>
/* 使用 contain 隔离渲染 */
.card {
contain: layout style paint;
}
/* 使用 will-change 优化动画 */
.element {
will-change: transform;
}
/* 避免昂贵的属性 */
.bad {
/* 避免 */
box-shadow: 0 0 10px rgba(0,0,0,0.5);
filter: blur(5px);
}
.good {
/* 使用 */
opacity: 0.5;
transform: translateZ(0);
}
JavaScript 优化
JavaScript 是阻塞渲染的主要因素:
// 使用 defer 和 async
<script src="non-critical.js"
async></script>
<script src="deferred.js"
defer></script>
// 使用 Web Workers 处理繁重任务
const worker = new Worker('worker.js');
worker.onmessage = (e) => {
console.log('结果:', e.data);
};
worker.postMessage({ data: heavyTask });
// 请求优化
// 批量请求
const data = await Promise.all([
fetch('/api/1'),
fetch('/api/2'),
fetch('/api/3')
]);
// 使用 Intersection Observer
const observer = new IntersectionObserver(
(entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
loadContent(entry.target);
}
});
}
);
缓存策略
有效的缓存可以大幅减少重复访问的加载时间:
浏览器缓存
使用 Cache-Control 和 ETag 让浏览器缓存静态资源
Service Worker
实现离线缓存和推送通知
CDN 缓存
使用内容分发网络加速全球访问
HTTP/2 推送
服务器主动推送关键资源
本地存储
使用 localStorage 和 IndexedDB 缓存数据
策略更新
使用版本号或哈希值管理缓存失效
性能监测
持续监测性能指标,找出优化机会:
// Performance API
const perfData = performance.getEntriesByType('navigation')[0];
console.log('页面加载时间:', perfData.loadEventEnd - perfData.fetchStart);
console.log('DNS 查询时间:', perfData.domainLookupEnd - perfData.domainLookupStart);
console.log('TCP 连接时间:', perfData.connectEnd - perfData.connectStart);
console.log('请求响应时间:', perfData.responseEnd - perfData.requestStart);
// Web Vitals
import { onLCP, onFID, onCLS } from 'web-vitals';
onLCP(console.log);
onFID(console.log);
onCLS(console.log);
常用工具
使用专业工具分析和优化性能:
Lighthouse
Chrome 内置的性能审计工具
WebPageTest
详细的多地点性能测试
DevTools
实时性能分析和网络监控
总结
Web 性能优化是一个持续的过程,需要在开发、构建、部署和监控各个环节都给予关注。从资源加载到渲染优化,从代码分割到缓存策略,每一个优化点都可能带来显著的性能提升。
记住,性能是用户体验的基础。一个快速流畅的网站不仅能提升用户满意度,还能改善 SEO 和转化率。投入时间优化性能,是最有价值的投资之一。