Skip to content

性能与优化

简介

Web性能优化是提升用户体验和业务价值的关键环节。在移动网络和多样化设备普及的背景下,优化网站性能不仅关系到用户体验,还直接影响业务指标,如转化率、跳出率和用户留存。

本节内容涵盖前端性能测量、关键渲染路径优化、资源加载优化、运行时性能等方面,帮助开发者构建快速响应的Web应用。

技术领域

性能测量与分析

  • 性能指标
    • Core Web Vitals
    • RAIL模型
    • 首次内容绘制(FCP)
    • 最大内容绘制(LCP)
    • 首次输入延迟(FID)
    • 累积布局偏移(CLS)
  • 性能监控工具
    • Lighthouse
    • Chrome DevTools
    • Web Vitals库
    • 性能API
  • 用户体验指标
    • 感知性能
    • 交互性能
    • 视觉稳定性
    • A/B测试

加载性能优化

  • 资源优化
    • 图片优化
    • JavaScript优化
    • CSS优化
    • 字体优化
  • 传输优化
    • HTTP/2与HTTP/3
    • 压缩算法
    • 预连接与预获取
    • CDN策略
  • 渲染优化
    • 关键CSS
    • 延迟加载
    • 内容骨架屏
    • 资源优先级

运行时性能

  • JavaScript性能
    • 代码分割
    • 线程优化
    • Web Workers
    • WebAssembly
  • 渲染性能
    • 重排与重绘
    • 合成层优化
    • 动画性能
    • 渲染阻塞优化
  • 内存管理
    • 内存泄漏检测
    • 垃圾回收优化
    • 大列表虚拟化
    • 对象池

移动与低端设备优化

  • 响应式优化
    • 自适应图片
    • 媒体查询优化
    • 设备特性检测
    • 触控优化
  • 低端设备考量
    • 代码轻量化
    • 渐进增强
    • 节电优化
    • 离线支持

代码示例

js
// 图片懒加载与预加载示例
// 结合Intersection Observer和优先级提示

// 懒加载实现
document.addEventListener('DOMContentLoaded', () => {
  // 创建交叉观察器
  const imageObserver = new IntersectionObserver((entries, observer) => {
    entries.forEach(entry => {
      // 当图片进入视口
      if (entry.isIntersecting) {
        const img = entry.target;
        const src = img.getAttribute('data-src');
        
        if (src) {
          // 设置优先级提示
          if (img.hasAttribute('data-priority') && 'fetchPriority' in HTMLImageElement.prototype) {
            img.fetchPriority = img.getAttribute('data-priority');
          }
          
          // 加载图片
          img.src = src;
          
          // 加载后移除data-src属性
          img.removeAttribute('data-src');
          
          // 图片加载完成后停止观察
          observer.unobserve(img);
          
          // 性能标记
          if (window.performance && img.hasAttribute('data-mark')) {
            performance.mark(`img-loaded-${img.getAttribute('data-mark')}`);
          }
        }
      }
    });
  }, {
    // 根元素,默认为视口
    root: null,
    // 根边距,扩展或缩小视口
    rootMargin: '50px 0px',
    // 元素可见性触发阈值
    threshold: 0.01
  });
  
  // 为所有懒加载图片添加观察器
  const lazyImages = document.querySelectorAll('img[data-src]');
  lazyImages.forEach(img => {
    imageObserver.observe(img);
    
    // 添加加载错误处理
    img.addEventListener('error', function() {
      // 加载备用图片或显示错误提示
      this.src = '/images/fallback.png';
      this.classList.add('loading-error');
    });
  });
  
  // 预加载即将需要的图片
  function preloadNextImages() {
    const preloadImages = document.querySelectorAll('img[data-preload]');
    
    preloadImages.forEach(img => {
      const src = img.getAttribute('data-src');
      
      if (src) {
        const preloadLink = document.createElement('link');
        preloadLink.rel = 'preload';
        preloadLink.as = 'image';
        preloadLink.href = src;
        
        if (img.hasAttribute('data-priority')) {
          preloadLink.setAttribute('fetchpriority', img.getAttribute('data-priority'));
        }
        
        document.head.appendChild(preloadLink);
      }
    });
  }
  
  // 当首屏内容加载完成后预加载后续图片
  if ('requestIdleCallback' in window) {
    requestIdleCallback(preloadNextImages);
  } else {
    setTimeout(preloadNextImages, 1000);
  }
  
  // 监控性能指标
  if ('PerformanceObserver' in window) {
    const observer = new PerformanceObserver((list) => {
      const entries = list.getEntries();
      entries.forEach(entry => {
        // 将性能数据发送到分析服务
        console.log(`${entry.name}: ${entry.startTime.toFixed(2)}ms`);
      });
    });
    
    // 监听关键性能指标
    observer.observe({ type: 'largest-contentful-paint', buffered: true });
    observer.observe({ type: 'layout-shift', buffered: true });
    observer.observe({ type: 'mark', buffered: true });
  }
});

最佳实践

  • 建立性能预算和目标
  • 实施渐进式优化策略
  • 分析关键渲染路径
  • 优先关注用户感知指标
  • 针对移动设备优化
  • 实施持续性能监控

用知识点燃技术的火山