画像最適化

Web ページの画像サイズを削減し、表示速度と Core Web Vitals を向上させる技術群

パフォーマンスWeb

画像最適化とは

画像最適化は、Web ページの画像ファイルサイズを削減し、表示速度を向上させる技術群である。画像は Web ページの転送データ量の 50% 以上を占めることが多く、LCP (Largest Contentful Paint) に直接影響する。

最適化の 4 つの柱

1. フォーマットの選択

フォーマット 特徴 用途
WebP JPEG より 25〜35% 小さい、透過対応 写真、イラスト (推奨)
AVIF WebP よりさらに小さい、対応ブラウザが増加中 写真 (最高圧縮)
JPEG 広くサポート、写真向け フォールバック
PNG 可逆圧縮、透過対応 アイコン、スクリーンショット
SVG ベクター、拡大しても劣化しない ロゴ、アイコン

2. レスポンシブ画像

<!-- デバイスの画面幅に応じて適切なサイズの画像を配信 -->
<img
  srcset="hero-400.webp 400w, hero-800.webp 800w, hero-1200.webp 1200w"
  sizes="(max-width: 600px) 400px, (max-width: 1200px) 800px, 1200px"
  src="hero-800.webp"
  alt="Hero image"
  width="1200"
  height="630"
/>

モバイルに 1200px の画像を配信するのは無駄だ。srcset でデバイスに適したサイズを配信する。

3. 遅延読み込み

<!-- ファーストビュー外の画像は遅延読み込み -->
<img src="photo.webp" loading="lazy" alt="Photo" width="800" height="600" />

<!-- LCP 画像は遅延読み込みしない! -->
<img src="hero.webp" fetchpriority="high" alt="Hero" width="1200" height="630" />

4. サイズの明示

<!-- width/height を指定して CLS を防止 -->
<img src="photo.webp" width="800" height="600" alt="Photo" />

<!-- CSS の aspect-ratio でも可 -->
<style>.photo { aspect-ratio: 4 / 3; width: 100%; }</style>

Next.js の Image コンポーネント

import Image from 'next/image';

<Image
  src="/hero.jpg"
  alt="Hero"
  width={1200}
  height={630}
  priority          // LCP 画像: 遅延読み込みしない
  placeholder="blur" // ぼかしプレースホルダー
/>

next/image は自動的に WebP 変換、リサイズ、遅延読み込み、CLS 防止を行う。

CloudFront + Lambda@Edge での画像変換

オリジンの画像を Lambda@Edge でリアルタイムに変換 (リサイズ、WebP 変換) し、CloudFront でキャッシュする。

[ブラウザ][CloudFront] → キャッシュヒット → 変換済み画像を返す
                          → キャッシュミス → [Lambda@Edge] → S3 から取得 → 変換 → キャッシュ

画像フォーマットの比較

フォーマット 圧縮 透過 アニメーション 用途
WebP 高い 写真、イラスト
AVIF 最高 次世代フォーマット
PNG 低い ロゴ、アイコン
JPEG 写真
SVG - ベクター画像

体系的に学ぶなら関連書籍を参照してほしい。

関連用語