Web 性能优化完全指南
Web 性能优化是现代 Web 开发中的重要主题。一个快速响应的网站不仅能提供更好的用户体验,还能提高搜索引擎排名和转化率。
性能指标与测量
首先,我们需要了解关键的性能指标:
Core Web Vitals
// 使用 Web Vitals 库测量性能
import { getLCP, getFID, getCLS } from 'web-vitals';
getLCP(console.log);
getFID(console.log);
getCLS(console.log);
资源优化
图片优化
图片通常是网页中最大的资源,优化图片可以显著提升性能。


代码分割
将代码分割成更小的块,按需加载。
// 动态导入
const LazyComponent = lazy(() => import('./LazyComponent'));
// 路由级别的代码分割
const Home = lazy(() => import('./pages/Home'));
const About = lazy(() => import('./pages/About'));
function App() {
return (
Loading...
);
}
缓存策略
HTTP 缓存
// Express.js 缓存设置
app.use('/static', express.static('public', {
maxAge: '1y', // 静态资源缓存一年
etag: true,
lastModified: true
}));
// API 响应缓存
app.get('/api/data', (req, res) => {
res.set({
'Cache-Control': 'public, max-age=300', // 5分钟
'ETag': generateETag(data)
});
res.json(data);
});
Service Worker 缓存
// service-worker.js
const CACHE_NAME = 'app-v1';
const urlsToCache = [
'/',
'/static/css/main.css',
'/static/js/main.js'
];
self.addEventListener('install', (event) => {
event.waitUntil(
caches.open(CACHE_NAME)
.then((cache) => cache.addAll(urlsToCache))
);
});
self.addEventListener('fetch', (event) => {
event.respondWith(
caches.match(event.request)
.then((response) => {
// 缓存命中,返回缓存的资源
if (response) {
return response;
}
// 否则发起网络请求
return fetch(event.request);
})
);
});
关键渲染路径优化
CSS 优化
/* 首屏关键样式 */
.header { /* ... */ }
.hero { /* ... */ }
JavaScript 优化
网络优化
HTTP/2 和 HTTP/3
利用现代 HTTP 协议的优势:
**多路复用**:并行请求 **服务器推送**:主动推送资源 **头部压缩**:减少传输开销
CDN 配置
// 使用 CDN 加速静态资源
const cdnUrl = 'https://cdn.example.com';
function getAssetUrl(path) {
if (process.env.NODE_ENV === 'production') {
return `${cdnUrl}${path}`;
}
return path;
}
运行时性能优化
虚拟滚动
对于大量数据的列表,使用虚拟滚动:
// 简单的虚拟滚动实现
function VirtualList({ items, itemHeight, containerHeight }) {
const [scrollTop, setScrollTop] = useState(0);
const visibleStart = Math.floor(scrollTop / itemHeight);
const visibleEnd = Math.min(
visibleStart + Math.ceil(containerHeight / itemHeight),
items.length
);
const visibleItems = items.slice(visibleStart, visibleEnd);
return (
style={{ height: containerHeight, overflow: 'auto' }}
onScroll={(e) => setScrollTop(e.target.scrollTop)}
>
{visibleItems.map((item, index) => (
key={visibleStart + index}
style={{
position: 'absolute',
top: (visibleStart + index) * itemHeight,
height: itemHeight
}}
>
{item}
))}
);
}
防抖和节流
// 防抖函数
function debounce(func, wait) {
let timeout;
return function executedFunction(...args) {
const later = () => {
clearTimeout(timeout);
func(...args);
};
clearTimeout(timeout);
timeout = setTimeout(later, wait);
};
}
// 节流函数
function throttle(func, limit) {
let inThrottle;
return function(...args) {
if (!inThrottle) {
func.apply(this, args);
inThrottle = true;
setTimeout(() => inThrottle = false, limit);
}
};
}
// 使用示例
const debouncedSearch = debounce(searchFunction, 300);
const throttledScroll = throttle(scrollHandler, 100);
监控与分析
性能监控
// 自定义性能监控
class PerformanceMonitor {
static measure(name, fn) {
const start = performance.now();
const result = fn();
const end = performance.now();
console.log(`${name} took ${end - start} milliseconds`);
// 发送到分析服务
this.sendMetric(name, end - start);
return result;
}
static sendMetric(name, value) {
// 发送性能数据到监控服务
fetch('/api/metrics', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ name, value, timestamp: Date.now() })
});
}
}
// 使用示例
const result = PerformanceMonitor.measure('dataProcessing', () => {
return processLargeDataset(data);
});
性能预算
建立性能预算,确保网站性能不会退化:
{
"budgets": [
{
"type": "bundle",
"name": "main",
"maximumWarning": "250kb",
"maximumError": "500kb"
},
{
"type": "initial",
"maximumWarning": "2mb",
"maximumError": "5mb"
}
]
}
总结
Web 性能优化是一个持续的过程,需要从多个维度进行优化:
**资源优化**:压缩、合并、懒加载 **缓存策略**:合理利用浏览器和 CDN 缓存 **关键渲染路径**:优化首屏加载时间 **运行时性能**:减少 JavaScript 执行时间 **监控分析**:持续监控和改进
记住,性能优化要基于实际数据和用户体验,不要过度优化。建立性能监控体系,定期分析和改进,才能确保网站始终保持良好的性能表现。