页面加载速度直接影响用户体验和转化率。本文将分享我在实际项目中进行性能优化的经验,将页面加载时间从 3 秒优化到了 1 秒以内。
性能优化前的准备
在开始优化之前,我们需要先了解当前的性能状况。
性能测量工具
- Lighthouse:Google 推出的性能检测工具,提供全面的性能报告。
- WebPageTest:可以在不同地点和设备上测试页面性能。
- Chrome DevTools:强大的开发者工具,包含 Performance 和 Network 面板。
关键性能指标
- LCP (Largest Contentful Paint):最大内容绘制时间,目标小于 2.5s
- FID (First Input Delay):首次输入延迟,目标小于 100ms
- CLS (Cumulative Layout Shift):累积布局偏移,目标小于 0.1
优化方案
根据性能报告,我们制定了以下优化方案:
1. 图片优化
图片是页面加载速度的最大瓶颈,占比通常超过 50%。
优化措施
- 使用现代图片格式:将 JPEG/PNG 转换为 WebP 或 AVIF,体积可减少 25% 到 50%。
- 响应式图片:使用 srcset 和 sizes 属性,根据设备分辨率加载合适大小的图片。
- 懒加载:只加载可视区域内的图片。
- 压缩图片:使用工具压缩图片质量,去除元数据。
代码示例
<img
src="image.webp"
srcset="image-480.webp 480w, image-800.webp 800w"
sizes="(max-width: 600px) 480px, 800px"
loading="lazy"
alt="示例图片"
>
2. JavaScript 优化
JavaScript 执行时间过长会阻塞页面渲染。
优化措施
- 代码分割:使用 Webpack 或 Vite 的代码分割功能,按需加载。
- 压缩代码:使用 Terser 压缩 JavaScript 代码。
- 移除未使用的代码:使用 Tree Shaking 移除未使用的模块。
- 异步加载:对非关键脚本使用 async 或 defer 属性。
代码示例
<script src="app.js" defer></script>
<script src="analytics.js" async></script>
3. CSS 优化
CSS 阻塞渲染,需要尽可能优化。
优化措施
- 内联关键 CSS:将首屏所需的 CSS 内联到 HTML 中。
- 压缩 CSS:使用 CSSNano 压缩 CSS 代码。
- 移除未使用的 CSS:使用 PurgeCSS 或 Chrome DevTools 的 Coverage 面板。
- 使用 CSS 变量:减少重复代码,便于维护。
4. 缓存策略
合理使用缓存可以显著减少重复请求。
优化措施
- 浏览器缓存:设置合适的 Cache-Control 和 ETag 响应头。
- 服务端缓存:使用 Redis 等缓存数据库存储计算结果。
- CDN 缓存:利用 CDN 的边缘缓存能力。
- 版本控制:给静态资源添加版本号,如 app.abc123.js。
HTTP 缓存头示例
Cache-Control: public, max-age=31536000, immutable
ETag: "abc123"
5. 服务器优化
服务器响应速度也会影响页面加载时间。
优化措施
- 使用 CDN:将静态资源部署到 CDN,减少网络延迟。
- 启用 Gzip/Brotli 压缩:压缩传输的数据。
- 使用 HTTP/2:支持多路复用,减少连接开销。
- 优化数据库查询:添加索引,减少查询时间。
优化效果对比
经过以上优化,我们的页面性能得到了显著提升:
| 指标 | 优化前 | 优化后 | 提升幅度 |
|---|---|---|---|
| LCP | 3.2s | 0.8s | 75% |
| FID | 280ms | 60ms | 79% |
| CLS | 0.35 | 0.08 | 77% |
| 页面加载时间 | 3.5s | 1.1s | 69% |
| 请求数量 | 45 | 22 | 51% |
| 资源总大小 | 1.2MB | 450KB | 62% |
持续优化
性能优化不是一次性的工作,需要持续关注和改进。
建立性能监控
- 设置性能预算,在 CI/CD 流程中加入性能检测
- 使用 Real User Monitoring (RUM) 工具收集真实用户数据
- 定期进行性能审计
保持优化意识
- 在开发过程中考虑性能影响
- 优先使用性能友好的技术方案
- 关注行业最新的性能优化技术
总结
性能优化是一个系统性的工程,需要从多个方面入手:
- 先测量,再优化
- 优先解决最大的性能瓶颈
- 使用合适的工具和技术
- 持续监控和改进
记住,每减少 100ms 的加载时间,都可能带来显著的用户体验提升和转化率增长。