Skip to content

如果想在图片这块做性能优化,你有哪些思路?

参考答案:

以下是一些常见的图片优化思路:

1. 图片格式优化

  1. 选择合适的图片格式

    • JPEG:适合照片类图片,有损压缩,文件体积小。
    • PNG:适合需要透明背景的图片,无损压缩,体积较大。
    • WebP:现代图片格式,支持有损和无损压缩,体积更小,兼容性逐步提高。
    • AVIF:更高效的现代格式,体积小但兼容性较 WebP 差一些。
    • SVG:适合图标和简单图形,基于矢量,支持缩放不失真。
  2. 根据设备需求动态提供格式

    • 使用工具(如 sharp 或服务端配置)生成不同格式的图片,并根据浏览器支持选择最佳格式(如 WebP 优先)。

2. 图片压缩

  1. 无损压缩
    • 保留图片质量的同时减少文件大小。常用工具:
      • 在线工具:TinyPNG、ImageOptim
      • 本地工具:imageminsharp
  2. 有损压缩
    • 对允许质量稍有下降的图片,可以进一步压缩,显著减少体积。

3. 响应式图片

  1. 使用 <picture> 元素: 根据不同的屏幕分辨率和尺寸,加载合适尺寸的图片。

    html
    <picture>
        <source srcset="image-large.webp" type="image/webp" media="(min-width: 1024px)">
        <source srcset="image-small.webp" type="image/webp" media="(max-width: 1024px)">
        <img src="image-fallback.jpg" alt="example image">
    </picture>
  2. 使用 srcset 属性: 指定不同尺寸的图片,让浏览器选择最适合的版本。

    html
    <img src="image-default.jpg" srcset="image-small.jpg 480w, image-medium.jpg 800w, image-large.jpg 1200w" sizes="(max-width: 600px) 480px, (max-width: 1200px) 800px, 1200px" alt="example">

4. 懒加载(Lazy Loading)

  1. 使用 loading="lazy" 属性(现代浏览器支持): 图片在进入视口前不会加载,减少首屏加载压力。

    html
    <img src="image.jpg" alt="example" loading="lazy">
  2. 使用 JavaScript 实现懒加载: 可以基于 Intersection Observer API 实现更复杂的懒加载逻辑。

    javascript
    const lazyImages = document.querySelectorAll('img[data-src]');
    const observer = new IntersectionObserver((entries, observer) => {
        entries.forEach(entry => {
            if (entry.isIntersecting) {
                const img = entry.target;
                img.src = img.dataset.src;
                observer.unobserve(img);
            }
        });
    });
    
    lazyImages.forEach(img => observer.observe(img));

5. 使用 CDN(内容分发网络)

  • 图片托管在 CDN 上
    • CDN 会根据用户地理位置提供最近的服务器加速图片加载。
    • 提供图片的格式转换、压缩、裁剪等功能(如阿里云 OSS、Cloudflare Images)。

6. CSS 背景图优化

  1. 雪碧图(Sprites)
    • 将多个小图标合并成一张大图,减少 HTTP 请求次数。
  2. Base64 编码
    • 对小图标(<2KB)直接进行 Base64 编码内嵌到 CSS 文件中,避免额外的 HTTP 请求。

7. 占位符技术

  1. 使用低分辨率图片作为占位符
    • 在图片加载前显示模糊的低清晰度版本,提升用户感知。
  2. 骨架屏设计
    • 使用 CSS 或图片的尺寸占位,防止内容跳动(Cumulative Layout Shift)。

8. 图片缓存

  1. 设置缓存头

    • 通过 HTTP 响应头设置 Cache-ControlETag,减少重复加载。
  2. 文件名带版本号

    • 文件名如 image-v1.jpg,更新图片时改变版本号避免缓存冲突。

9. 使用矢量图

  1. SVG 图像
    • 用于图标和简单图形,支持缩放且体积小。
  2. 图标库
    • 使用 IconFont 或类似 Font Awesome 的字体图标库替代图片图标。

10. 动态图片优化

  1. 服务端裁剪
    • 根据用户设备的分辨率或屏幕尺寸生成适配的图片尺寸。
  2. 图片懒生成
    • 在用户需要时,才生成或传输对应版本的图片。

题目要点:

图片优化是前端性能优化中的关键环节,从选择合适格式、压缩、响应式设计,到懒加载、缓存、CDN 加速等,构成了完整的优化链条。