Back

fetchpriorityを使用したPriority Hintsによるパフォーマンス最適化

fetchpriorityを使用したPriority Hintsによるパフォーマンス最適化

Fetch Priority APIは、fetchpriority属性を通じてブラウザがリソースの読み込み優先度を制御する直接的な手段を提供します。このHTML属性は、重要なリソースを最初に読み込み、重要度の低いアセットを後回しにすることで、Core Web Vitalsの最適化に役立ちます。

重要なポイント

  • fetchpriority属性は、high、low、autoの値でデフォルトのブラウザリソース優先度を上書きします
  • LCP画像が優先度ヒントから最も恩恵を受け、実際のテストで0.5〜2秒の改善を示しています
  • 優先度ヒントはpreloadやpreconnectを補完しますが、読み込みパイプラインでは異なる目的を果たします
  • ブラウザサポートはChrome 102+、Safari 17.2+、Firefox 132+に対応し、グレースフルデグラデーションを提供します

fetchpriority属性のパフォーマンス影響の理解

ブラウザは、タイプと場所に基づいてリソースに自動的に優先度を割り当てます。<head>内のCSSは最高優先度を取得し、画像は低優先度から開始します。fetchpriority属性を使用すると、これらのデフォルト設定を3つの値で上書きできます:

  • high:デフォルトより上のリソース優先度を向上
  • low:デフォルトより下の優先度を削減
  • auto:ブラウザのデフォルトを使用(デフォルト値)

異なる要素での動作方法は以下の通りです:

<!-- LCP画像の優先度を向上 -->
<img src="hero.jpg" fetchpriority="high" alt="Hero image">

<!-- 非重要スクリプトの優先度を下げる -->
<script src="analytics.js" fetchpriority="low"></script>

<!-- カスタム優先度でプリロード -->
<link rel="preload" href="font.woff2" as="font" fetchpriority="high" crossorigin>

PreloadやPreconnectとの主な違い

preloadが早期リソース発見を強制し、preconnectがサーバー接続を準備する一方で、fetchpriority属性は発見後のダウンロード優先度を具体的に制御します。以下のように考えてください:

  • Preload:「このリソースを早期にダウンロードする」
  • Preconnect:「サーバー接続を準備する」
  • Fetchpriority:「ダウンロード時に、この優先度レベルを使用する」

これらのツールは相互に補完し合います。プリロードされた画像でも、デフォルトでは低優先度を取得します。fetchpriority="high"を追加することで、他の低優先度リソースより先にダウンロードされることが保証されます。

fetchpriorityを使用したLCP画像の最適化

パフォーマンスに対するfetchpriority属性の最も効果的な使用方法は、Largest Contentful Paint(LCP)画像の優先度向上です。デフォルトでは、ブラウザはレイアウト後にのみビューポート画像が重要であることを発見するため、遅延が発生します。

<!-- fetchpriorityなし:画像はキューで待機 -->
<img src="product-hero.jpg" alt="Featured product">

<!-- fetchpriorityあり:即座に高優先度でダウンロード -->
<img src="product-hero.jpg" fetchpriority="high" alt="Featured product">

実際のテストでは、ヒーロー画像にこの属性を追加するだけで、LCPが0.5〜2秒改善されることが示されています。

スクリプト優先度の管理

Asyncとdeferスクリプトは自動的に低優先度を取得しますが、これは重要な機能にとって必ずしも理想的ではありません:

<!-- 高優先度の重要なasyncスクリプト -->
<script src="app-core.js" async fetchpriority="high"></script>

<!-- 非重要なトラッキングスクリプトは低優先度のまま -->
<script src="tracking.js" async fetchpriority="low"></script>

<!-- 遅延読み込みの拡張スクリプト -->
<script src="enhancements.js" defer fetchpriority="low"></script>

Fetch API優先度の制御

JavaScript fetchリクエストはデフォルトで高優先度になります。バックグラウンド操作では、明示的に優先度を下げます:

// ユーザートリガーデータ(高優先度を維持)
const userData = await fetch('/api/user');

// バックグラウンド同期(低優先度)
const suggestions = await fetch('/api/suggestions', {
  priority: 'low'
});

// ページ読み込み中の重要なAPI呼び出し
const config = await fetch('/api/config', {
  priority: 'high'
});

非重要リソースの最適化

すべてのCSSやフォントが高優先度に値するわけではありません。fetchpriorityを使用して補助的なリソースの優先度を下げます:

<!-- 重要なスタイルを最初に読み込み -->
<link rel="stylesheet" href="critical.css">

<!-- テーマバリエーションは待機可能 -->
<link rel="preload" as="style" href="theme-dark.css" 
      fetchpriority="low" onload="this.rel='stylesheet'">

<!-- アイコンフォントは即座に表示されない -->
<link rel="preload" as="font" href="icons.woff2" 
      crossorigin fetchpriority="low">

fetchpriority実装のベストプラクティス

fetchpriority属性はヒントであり、コマンドではありません。ブラウザは独自のヒューリスティックに基づいて設定を上書きする場合があります。以下のガイドラインに従ってください:

控えめに使用:パフォーマンスに測定可能な影響を与えるリソースの優先度のみを調整します。LCP画像と重要なスクリプトから始めましょう。

preloadと戦略的に組み合わせ:LCPをトリガーするCSS背景画像の場合:

<link rel="preload" as="image" href="hero-bg.jpg" fetchpriority="high">

影響をテスト:Chrome DevToolsのNetworkパネルを使用して優先度の変更を確認します。Priorityカラムを確認し、ページ読み込み中の優先度シフトを監視してください。

帯域幅を考慮:優先度ヒントは、リソースが限られた帯域幅を競合する低速接続で最も重要です。HTTP/1.1接続はHTTP/2やHTTP/3よりも多くの恩恵を受けます。

過度な使用を避ける:すべてを高優先度に設定すると目的が台無しになります。ページあたり2〜3の真に重要なリソースに焦点を当ててください。

ブラウザサポートと実装

fetchpriority属性は、モダンブラウザ全体で幅広いサポートを享受しています:

  • Chrome/Edge:102+
  • Safari:17.2+
  • Firefox:132+

古いブラウザは単純に属性を無視するため、プログレッシブエンハンスメントとして機能します。ポリフィルは不要です。

結論

fetchpriority属性は、リソース読み込み優先度の細かい制御を提供し、Core Web Vitalsのパフォーマンスに直接影響を与えます。LCP画像の向上、asyncスクリプト優先度の管理、非重要リソースの競合削減に焦点を当ててください。これはヒントであることを忘れずに、変更をテストし、ブラウザが常に優先度を尊重すると仮定するのではなく、実際のパフォーマンス影響を測定してください。

よくある質問

はい、ただし効果は限定的です。lazy-loaded画像は既に必要になるまで読み込みを遅延させています。fetchpriority=highは、ビューポートに即座に表示されるlazy画像にのみ使用してください。そうでなければ、ブラウザは画像が読み込みしきい値に入るまでヒントを無視します。

はい、fetchpriorityはすべてのHTTPバージョンで動作します。HTTP/2とHTTP/3は多重化によりhead-of-lineブロッキングを排除しますが、優先度ヒントは依然としてブラウザがリソースを要求・処理する順序を制御し、特に帯域幅制約のある接続で有効です。

Chrome DevToolsのNetworkタブを開き、Priorityカラムを有効にしてください。fetchpriorityを持つリソースは、デフォルトの代わりにHighやLowなどの調整された優先度を表示します。Performanceパネルで実際の読み込み時間の改善も確認できます。

いいえ、fetchpriority=highは単一のLCP画像のみに予約してください。複数の高優先度画像は相互に競合し、重要なCSS/JavaScriptと競合します。ブラウザは既に表示される画像を自動的に向上させるため、最も重要な視覚的要素に対してのみ上書きしてください。

Understand every bug

Uncover frustrations, understand bugs and fix slowdowns like never before with OpenReplay — the open-source session replay tool for developers. Self-host it in minutes, and have complete control over your customer data. Check our GitHub repo and join the thousands of developers in our community.

OpenReplay