Web 性能优化:从理论到实践

Web 性能优化:从理论到实践

在当今快节奏的互联网时代,网站性能直接影响用户体验和业务指标。本文将全面介绍 Web 性能优化的核心策略和实践方法。

性能指标

Core Web Vitals

Google 提出的核心性能指标:

  • LCP (Largest Contentful Paint): 最大内容绘制,应小于 2.5 秒
  • FID (First Input Delay): 首次输入延迟,应小于 100 毫秒
  • CLS (Cumulative Layout Shift): 累积布局偏移,应小于 0.1

资源加载优化

1. 图片优化

<!-- 使用现代图片格式 -->
<picture>
  <source srcset="image.avif" type="image/avif">
  <source srcset="image.webp" type="image/webp">
  <img src="image.jpg" alt="描述" loading="lazy">
</picture>

2. 代码分割

// 动态导入
const LazyComponent = React.lazy(() => import('./Component'));

// Webpack 配置
module.exports = {
  optimization: {
    splitChunks: {
      chunks: 'all',
      cacheGroups: {
        vendor: {
          test: /[\\/]node_modules[\\/]/,
          name: 'vendors',
          chunks: 'all',
        },
      },
    },
  },
};

3. 资源预加载

<!-- DNS 预解析 -->
<link rel="dns-prefetch" href="https://api.example.com">

<!-- 预连接 -->
<link rel="preconnect" href="https://api.example.com">

<!-- 预加载关键资源 -->
<link rel="preload" href="/critical.css" as="style">
<link rel="preload" href="/hero-image.jpg" as="image">

代码优化

1. 减少 JavaScript 体积

  • 使用 Tree Shaking 移除未使用的代码
  • 压缩和混淆代码
  • 使用现代 JavaScript 特性(ES6+)

2. CSS 优化

/* 避免过度嵌套 */
/* ❌ 不好的做法 */
.nav .menu .item .link { }

/* ✅ 好的做法 */
.nav-link { }

/* 使用 CSS 变量 */
:root {
  --primary-color: #667eea;
}

.button {
  background: var(--primary-color);
}

3. 字体优化

/* 使用 font-display: swap */
@font-face {
  font-family: 'CustomFont';
  src: url('font.woff2') format('woff2');
  font-display: swap;
}

/* 子集化字体 */
/* 只加载需要的字符 */

缓存策略

1. HTTP 缓存

# Nginx 配置示例
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
    expires 1y;
    add_header Cache-Control "public, immutable";
}

2. Service Worker 缓存

// Service Worker
self.addEventListener('fetch', event => {
  event.respondWith(
    caches.match(event.request).then(response => {
      return response || fetch(event.request);
    })
  );
});

渲染优化

1. 关键渲染路径优化

<!-- 内联关键 CSS -->
<style>
  /* 关键样式 */
</style>

<!-- 延迟非关键 CSS -->
<link rel="preload" href="styles.css" as="style" onload="this.onload=null;this.rel='stylesheet'">

2. 避免阻塞渲染

// 使用 async 或 defer
<script src="script.js" defer></script>
<script src="analytics.js" async></script>

网络优化

1. HTTP/2 和 HTTP/3

使用现代 HTTP 协议提升性能:

  • HTTP/2: 多路复用、头部压缩
  • HTTP/3: 基于 UDP 的 QUIC 协议

2. CDN 使用

使用内容分发网络(CDN)加速资源加载。

3. 压缩

启用 Gzip 或 Brotli 压缩:

# Gzip 压缩
gzip on;
gzip_types text/plain text/css application/json application/javascript;

监控和测量

性能监控工具

  • Lighthouse: Chrome DevTools 内置
  • WebPageTest: 在线性能测试
  • Performance API: 浏览器原生 API
// 使用 Performance API
const perfData = window.performance.timing;
const pageLoadTime = perfData.loadEventEnd - perfData.navigationStart;
console.log(`页面加载时间: ${pageLoadTime}ms`);

移动端优化

1. 响应式图片

<img 
  srcset="small.jpg 480w, medium.jpg 768w, large.jpg 1200w"
  sizes="(max-width: 768px) 100vw, 50vw"
  src="medium.jpg"
  alt="描述"
>

2. 触摸优化

/* 优化触摸响应 */
button {
  touch-action: manipulation;
  -webkit-tap-highlight-color: transparent;
}

总结

性能优化是一个持续的过程:

  1. 测量: 使用工具测量当前性能
  2. 分析: 识别性能瓶颈
  3. 优化: 实施优化策略
  4. 验证: 测试优化效果
  5. 迭代: 持续改进

记住,过早优化是万恶之源。先确保功能正确,再优化性能。


性能优化清单:

  • 图片优化和懒加载
  • 代码分割和懒加载
  • 资源压缩和缓存
  • 减少 HTTP 请求
  • 使用 CDN
  • 启用 HTTP/2
  • 优化关键渲染路径
  • 监控性能指标