Web 性能优化完全指南 - 从加载到交互
🔧 返回工具箱 | Back to Tools
浏览所有工具 | View All ToolsWeb 性能优化完全指南
用户体验的第一步是速度。一个加载缓慢的网站,即使功能再强大、设计再精美,也会被用户无情地放弃。根据研究,网页加载延迟每增加 100ms,网站的访问量就会下降 1%。
这篇文章将系统地介绍 Web 性能优化的各个方面。
1. 资源加载优化
代码压缩与最小化
JavaScript 和 CSS 文件越大,下载和解析时间就越长。代码压缩可以消除空格、注释和可优化的代码结构。
一个 100KB 的未压缩 JavaScript 文件,压缩后可能只有 30KB,减少 70% 的体积!
// 压缩前
function calculateUserAge(birthYear) {
// 计算用户年龄
const currentYear = new Date().getFullYear();
const age = currentYear - birthYear;
return age;
}
// 压缩后
function calculateUserAge(a){return new Date().getFullYear()-a}
我们的 代码压缩工具 可以批量压缩 JavaScript、CSS 和 HTML。
最佳实践:使用构建工具(Webpack、Vite)自动压缩,不要手工处理。
Image 优化
图片通常占网站总体积的 50-80%,优化图片效果立竿见影。
图片格式选择
- JPEG:适合照片和复杂图像,压缩率高
- PNG:适合需要透明度的图像
- WebP:新一代格式,体积比 JPEG 小 25-35%,如浏览器支持建议优先使用
- SVG:矢量图形,放大不失真,代码可维护
响应式图片
<img
src="photo-large.jpg"
srcset="photo-small.jpg 500w, photo-large.jpg 1500w"
sizes="(max-width: 600px) 500px, 1500px"
alt="描述"
/>
这样不同设备会加载合适尺寸的图片,手机加载小版本。
懒加载
<img src="photo.jpg" loading="lazy" alt="描述" />
只有当图片进入视口时才加载,显著减少初始加载时间。
异步加载脚本
<!-- 同步加载,阻塞页面渲染 -->
<script src="analytics.js"></script>
<!-- 异步加载,不阻塞页面 -->
<script async src="analytics.js"></script>
<!-- 延迟加载,在文档解析完成后加载 -->
<script defer src="app.js"></script>
根据规则:
- 关键的业务逻辑脚本用
defer - 分析和第三方脚本用
async - 不关键的功能脚本放在
<body>末尾
2. 缓存策略
浏览器缓存
# Nginx 配置示例
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}
location / {
expires -1;
add_header Cache-Control "no-cache, no-store, must-revalidate";
}
静态资源(CSS、JS、图片)设置较长的过期时间,HTML 每次都验证。
HTTP 缓存头剖析
| 头部 | 作用 | 示例 |
|---|---|---|
Cache-Control |
缓存策略 | max-age=3600, public |
ETag |
资源版本标识 | W/"33a64df…" |
Last-Modified |
资源最后修改时间 | Wed, 21 Oct 2025 07:28:00 GMT |
Expires |
过期时间(已弃用) | Wed, 21 Oct 2026 07:28:00 GMT |
最佳实践:使用 Cache-Control 而非 Expires,它更灵活。
服务端缓存
使用 Redis 缓存频繁请求的数据:
const { createClient } = require('@upstash/redis');
const redis = createClient();
async function getUserData(userId) {
// 先查缓存
const cached = await redis.get(`user:${userId}`);
if (cached) return JSON.parse(cached);
// 缓存未命中,从数据库查询
const data = await db.user.findOne(userId);
// 存入缓存,15 分钟过期
await redis.setex(`user:${userId}`, 900, JSON.stringify(data));
return data;
}
3. 网络优化
CDN 加速
CDN(Content Delivery Network)通过在全球部署服务器,让用户从地理位置最近的服务器获取内容。
比如,中国用户从美国服务器下载需要 200-400ms,而通过中国 CDN 节点只需 10-20ms。
主流 CDN 服务:Cloudflare、AWS CloudFront、阿里云 CDN 等。
HTTP/2 与 HTTP/3
HTTP/2 vs HTTP/1.1:
- 多路复用:一条连接传输多个资源,不需要建立多条连接
- 头部压缩:减少重复数据
- 服务端推送:主动发送关键资源
# Nginx 启用 HTTP/2
server {
listen 443 ssl http2;
...
}
Gzip 压缩
gzip on;
gzip_types text/plain text/css text/javascript application/json;
gzip_min_length 1000;
gzip_level 6;
Gzip 可以将 HTML/CSS/JS 的大小压缩 60-70%。
4. 渲染优化
首次内容绘制 (FCP) 优化
FCP 是从用户开始导航到第一个内容出现在屏幕上的时间。
优化方案:
- 不阻塞 CSS 加载,关键 CSS 内联在
<head>中 - 推迟非关键 CSS 的加载
<head>
<style>
/* 关键 CSS 内联 */
body { font-size: 16px; }
h1 { color: #333; }
</style>
<link rel="preload" href="/styles.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
</head>
关键渲染路径
用户输入 URL
↓
DNS 查询 → TCP 连接 → TLS 握手
↓
下载 HTML
↓
解析 HTML → 下载 CSS/JS → 构建 DOM 树
↓
CSS 对象模型 (CSSOM)
↓
布局树 (Layout Tree)
↓
图层树 (Layer Tree)
↓
栅格化和合成
↓
屏幕显示
减少关键路径上的资源数量和体积,是优化的关键。
5. 性能测试工具
Lighthouse
Google 开发的性能检测工具,集成在 Chrome DevTools 中。
- Performance:概览性能分数和关键指标
- Accessibility:无障碍访问性检查
- Best Practices:最佳实践检查
- SEO:搜索引擎优化建议
WebPageTest
免费在线工具,支持选择真实浏览器和网络条件进行测试,提供详细的瀑布图和分析。
Core Web Vitals
Google 官方定义的 3 个关键指标:
| 指标 | 名称 | 优秀标准 |
|---|---|---|
| LCP | 最大内容绘制 | < 2.5s |
| FID | 首次输入延迟 | < 100ms |
| CLS | 累积布局偏移 | < 0.1 |
实战案例
一个典型的性能优化流程:
- 测试:使用 Lighthouse 获取基线数据(假设得分 45)
- 分析:找出最耗时的资源和瓶颈
- 优化:
- 压缩 JavaScript 文件(-30% 体积)
- 启用 Gzip 压缩(-65% 传输大小)
- 图片优化为 WebP(-40% 体积)
- 启用 CDN(-70% 延迟)
- 验证:再次测试,观察得分提升(通常能到 85+)
性能预算
定义可接受的性能指标,确保每次迭代都不会退步:
// performance-budget.json
{
"bundles": [
{
"name": "main",
"maxSize": "100kb",
"maxRequests": 5
},
{
"name": "vendor",
"maxSize": "200kb",
"maxRequests": 3
}
]
}
在 CI/CD 流程中集成预算检查,超出时自动失败。
相关工具推荐: