DPRでWebサイトのパフォーマンスを向上!画像の読み込み速度とデータ使用量を節約


DPR の仕組み

  1. ブラウザは、DPR 情報を含む Accept-CH ヘッダーを Web サーバーに送信します。
  2. Web サーバーは、DPR 情報に基づいて最適な画像サイズを選択し、Content-DPR ヘッダーを含むレスポンスを返します。
  3. ブラウザは、Content-DPR ヘッダーの情報を使用して、画像を適切なスケーリングで表示します。

DPR の利点

  • ページの読み込み速度を向上させることができます。
  • 低解像度デバイスで、画像を適切なサイズに縮小し、データ使用量を節約できます。
  • 高解像度デバイスで、画像をシャープかつ鮮明に表示できます。

DPR の実装

DPR を実装するには、Web サーバー側とクライアント側の両方で設定が必要です。

Web サーバー側

  • Content-DPR ヘッダーをレスポンスに含めます。
  • Accept-CH ヘッダーを認識し、それに応じて画像サイズを選択します。
  • Content-DPR ヘッダーの情報を使用して、画像を適切なスケーリングで表示します。
  • Accept-CH ヘッダーをリクエストに含めます。
  • DPR を誤って設定すると、画像が歪んだりぼやけたりする可能性があります。
  • 一部の画像フォーマットは、DPR に対応していない場合があります。
  • すべての Web サーバーとブラウザが DPR をサポートしているわけではありません。


Accept-CH ヘッダーを含むクライアント側リクエストの例

const request = new Request('https://example.com/image.jpg', {
  headers: {
    'Accept-CH': 'DPR=2.0'
  }
});

Content-DPR ヘッダーを含む Web サーバーレスポンスの例

HTTP/1.1 200 OK
Content-Type: image/jpeg
Content-DPR: 2.0

この例では、Web サーバーは Content-DPR ヘッダーを使用して、クライアントに 2 倍の解像度の画像を送信することを伝えます。

img 要素の srcset 属性を使用した DPR の実装例

<img srcset="image-2x.jpg 2x, image.jpg 1x" alt="Example image">

この例では、img 要素の srcset 属性を使用して、デバイスの DPR に応じて適切な画像を読み込みます。 DPR が 2 のデバイスでは image-2x.jpg が読み込まれ、DPR が 1 のデバイスでは image.jpg が読み込まれます。

const dpr = window.devicePixelRatio || 1;

console.log('DPR:', dpr);

この例では、JavaScript を使用してデバイスの DPR を検出し、コンソールにログ出力します。



レスポンシブ画像

レスポンシブ画像は、srcset 属性と sizes 属性を使用して、デバイスの画面サイズに応じて適切なサイズの画像を自動的に読み込みます。DPR を意識する必要がなく、より柔軟なレイアウトを作成できます。


<img srcset="image-2x.jpg 2x, image.jpg 1x"
     sizes="(max-width: 400px) 100vw, 400px"
     alt="Example image">

CSSメディアクエリ

CSSメディアクエリを使用して、デバイスの解像度に応じて異なるスタイルを適用できます。DPR に基づいてスタイルを調整することもできますが、より汎用性の高い方法です。


@media (min-resolution: 2dpx) {
  img {
    transform: scale(2);
  }
}

サーバー側ロジック

サーバー側でデバイス情報を取得し、それに応じて適切な画像サイズを返すロジックを実装することもできます。DPR に限らず、様々なデバイス特性に対応できますが、開発とメンテナンスの手間がかかります。

JavaScriptライブラリ

DPR を検出して処理を自動化してくれる JavaScript ライブラリがいくつか存在します。簡単に実装できますが、ライブラリの動作に依存することになります。

代表的なライブラリ

  • 将来性
    DPR は将来的に一般的になる可能性が高いため、将来的に互換性を維持できる方法を選択する必要があります。
  • パフォーマンス
    画像の読み込み回数が多くなる可能性があるため、パフォーマンスに注意する必要があります。
  • 柔軟性
    レスポンシブ画像は画面サイズに柔軟に対応できますが、CSSメディアクエリはより細かい制御が可能です。
  • 開発・運用コスト
    レスポンシブ画像は比較的シンプルですが、サーバー側ロジックは複雑になります。