Skip to content
⚠️ This article was written in 2019. Some content may be outdated.

フロントエンド画像フォーマット比較:WebP

適切な画像フォーマットの選択はフロントエンド開発でよく直面する問題です。本記事では実際のプロジェクトをベースに、具体的な実装方法と経験からの知見を紹介します。

フォーマット概要

フォーマット最適な用途圧縮方式透過アニメーション
JPEG写真非可逆なしなし
PNGアイコン、スクリーンショット可逆ありなし
GIFシンプルなアニメーション可逆ありあり
WebP全般両方ありあり
AVIF全般WebPより優秀ありあり

WebP

Googleが開発したWebPは、同等品質でJPEGより25〜34%、透過のあるPNGより26%ファイルサイズが小さくなります。

html
<!-- プログレッシブエンハンスメントのために<picture>を使用 -->
<picture>
  <source srcset="image.webp" type="image/webp" />
  <source srcset="image.jpg" type="image/jpeg" />
  <img src="image.jpg" alt="説明" />
</picture>
javascript
// WebPサポートの検出
function supportsWebP() {
  return new Promise((resolve) => {
    const img = new Image();
    img.onload = () => resolve(img.width > 0 && img.height > 0);
    img.onerror = () => resolve(false);
    img.src =
      "data:image/webp;base64,UklGRiIAAABXRUJQVlA4IBYAAAAwAQCdASoBAAEADsD+JaQAA3AAAAAA";
  });
}

レスポンシブ画像

html
<!-- srcset:ビューポートに基づいて異なるサイズを提供 -->
<img
  src="image-800.jpg"
  srcset="image-400.jpg 400w, image-800.jpg 800w, image-1200.jpg 1200w"
  sizes="(max-width: 600px) 400px, (max-width: 900px) 800px, 1200px"
  alt="レスポンシブ画像"
/>

ビルド時の最適化

javascript
// webpack:imageminで自動的にWebPに変換
const ImageMinimizerPlugin = require("image-minimizer-webpack-plugin");

module.exports = {
  plugins: [
    new ImageMinimizerPlugin({
      minimizerOptions: {
        plugins: [["imagemin-webp", { quality: 75 }]],
      },
    }),
  ],
};

一般的なルール:写真や複雑な画像にはWebP、アイコンやイラストにはSVGを使用し、WebPをサポートしないブラウザ向けに常にフォールバックを提供しましょう。

MIT Licensed