返回博客列表
性能优化
2023-12-25
20 分钟

Web 性能优化完全指南

从代码分割到图片优化,从缓存策略到 CDN 配置,全面提升 Web 应用的性能表现。

性能优化Web开发最佳实践
👁️543 次阅读
47 个赞
✍️作者:Charlie
Web 性能优化完全指南

Web 性能优化完全指南


Web 性能优化是现代 Web 开发中的重要主题。一个快速响应的网站不仅能提供更好的用户体验,还能提高搜索引擎排名和转化率。


性能指标与测量


首先,我们需要了解关键的性能指标:


Core Web Vitals


  • **LCP (Largest Contentful Paint)**:最大内容绘制时间
  • **FID (First Input Delay)**:首次输入延迟
  • **CLS (Cumulative Layout Shift)**:累积布局偏移

  • // 使用 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 优化




    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 执行时间
  • **监控分析**:持续监控和改进

  • 记住,性能优化要基于实际数据和用户体验,不要过度优化。建立性能监控体系,定期分析和改进,才能确保网站始终保持良好的性能表现。


    543 次阅读

    相关文章