性能优化的价值

性能就是用户体验。研究表明,页面加载时间每增加1秒,转化率下降7%。

优化不是一次性工作,而是持续的过程。

加载性能优化

1. 资源体积控制

代码压缩

// webpack配置
optimization: {
  minimize: true,
  minimizer: [new TerserPlugin()]
}

图片优化

  • 使用 WebP 格式(比 JPEG 小25-35%)
  • 响应式图片,根据设备加载合适尺寸
  • 懒加载非首屏图片
<img src="image.webp" 
     srcset="image-400.webp 400w, image-800.webp 800w"
     loading="lazy" 
     alt="描述">

Gzip/Brotli 压缩: 服务器启用压缩,文本资源可减少70%体积。

2. 代码分割与懒加载

路由级分割

const Home = lazy(() => import('./pages/Home'));
const About = lazy(() => import('./pages/About'));

组件级懒加载

const HeavyChart = lazy(() => import('./components/HeavyChart'));

预加载关键资源

<link rel="preload" href="critical.css" as="style">
<link rel="prefetch" href="next-page.js">

3. 缓存策略

Service Worker 缓存

// 缓存静态资源
workbox.routing.registerRoute(
  ({request}) => request.destination === 'image',
  new workbox.strategies.CacheFirst({
    cacheName: 'images',
    plugins: [
      new workbox.expiration.ExpirationPlugin({
        maxEntries: 50,
        maxAgeDays: 30
      })
    ]
  })
);

CDN 加速

  • 静态资源部署到 CDN
  • 利用浏览器 HTTP/2 多路复用

运行时性能优化

1. 减少重排重绘

避免频繁操作 DOM

// 不推荐
for (let i = 0; i < 1000; i++) {
  element.style.left = i + 'px';
}

// 推荐:使用 requestAnimationFrame
let i = 0;
function move() {
  if (i < 1000) {
    element.style.left = i + 'px';
    i++;
    requestAnimationFrame(move);
  }
}

使用 CSS Transformtransformopacity 不会触发重排。

2. 虚拟列表

长列表使用虚拟滚动,只渲染可视区域:

// react-window 示例
import { FixedSizeList } from 'react-window';

<FixedSizeList
  height={500}
  itemCount={10000}
  itemSize={50}
>
  {Row}
</FixedSizeList>

3. Web Worker 卸载计算

复杂计算移到 Worker,不阻塞主线程:

// main.js
const worker = new Worker('worker.js');
worker.postMessage({ data: largeArray });

// worker.js
self.onmessage = function(e) {
  const result = heavyComputation(e.data);
  self.postMessage(result);
};

性能指标与监控

Core Web Vitals

  • LCP (Largest Contentful Paint):2.5s 内优秀
  • FID (First Input Delay):100ms 内优秀
  • CLS (Cumulative Layout Shift):0.1 内优秀

监控工具

  • Lighthouse CI 自动化检测
  • Real User Monitoring (RUM)
  • Chrome DevTools Performance 面板

实战成果

对我们博客的优化效果:

  • 首屏加载时间:3.2s → 1.1s
  • Lighthouse 评分:65 → 98
  • 资源体积:1.8MB → 396KB

优化无止境,关键在于持续关注和测量。