#はじめに

「このリソースは後で必要になる」「このサーバーに接続する予定がある」——ブラウザにこれらの情報を事前に伝えることで、読み込みを高速化できます。

リソースヒントは、ブラウザに対する「ヒント」です。必要なリソースを先読みしたり、接続を事前に確立したりすることで、ユーザーが実際にリソースを必要としたときの待ち時間を削減できます。

この記事を読むと、以下のことができるようになります:

  • 各リソースヒントの違いを理解できる
  • 適切な場面で適切なヒントを使用できる
  • 過度な使用による問題を避けられる

#リソースヒントの種類

ヒント用途優先度
preload現在のページで必ず使うリソースを先読み
prefetch次のページで使うかもしれないリソースを先読み
preconnect外部サーバーへの接続を事前に確立
dns-prefetch外部サーバーのDNS解決を事前に実行

#preload

現在のページで確実に必要なリソースを、できるだけ早く読み込みます。

<link rel="preload" href="/fonts/main.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="/hero.webp" as="image">
<link rel="preload" href="/critical.css" as="style">

#as属性

リソースの種類を指定します。ブラウザが適切な優先度を設定できます。

用途
scriptJavaScript
styleCSS
fontフォント
image画像
fetchfetch/XHRリクエスト

#使用場面

  • LCP画像: ヒーロー画像など最初に表示される大きな画像
  • クリティカルフォント: ファーストビューで使用するWebフォント
  • 重要なスクリプト: 遅延読み込みされるが早く必要なJS

#例: LCP画像のpreload

<head>
  <!-- LCP画像を早期に読み込み -->
  <link rel="preload" as="image" href="/hero.webp" type="image/webp">
</head>
<body>
  <!-- 画像がHTMLに登場する前に読み込み開始 -->
  <img src="/hero.webp" alt="ヒーロー画像">
</body>

#注意点

  • preloadしたリソースを3秒以内に使用しないと、コンソールに警告が出ます
  • 過度なpreloadは逆効果(帯域の競合)

#prefetch

次のページで使う可能性があるリソースを、アイドル時間に先読みします。

<link rel="prefetch" href="/next-page.html">
<link rel="prefetch" href="/next-page-data.json">

#preloadとの違い

preloadprefetch
対象現在のページ次のページ
優先度低(アイドル時)
必須度必ず使う使うかもしれない

#使用場面

  • ページネーションの次のページ
  • ユーザーが次にクリックしそうなリンクのリソース
  • モーダルで使用する画像

#例: 次のページを先読み

<!-- ユーザーが「次へ」をクリックする可能性が高い -->
<link rel="prefetch" href="/articles/page-2">

#注意点

  • ユーザーが実際に使わない可能性がある(帯域の無駄)
  • モバイルユーザーはデータ通信量を気にする
  • データセーバーモードでは無視されることがある

#preconnect

外部サーバーへの接続(DNS、TCP、TLS)を事前に確立します。

<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://cdn.example.com" crossorigin>

#接続に必要な時間

DNS解決: ~50ms
TCP接続: ~50ms
TLS ハンドシェイク: ~100ms
合計: ~200ms(これを事前に済ませる)

#使用場面

  • Google Fonts など外部フォント
  • CDNからの画像・アセット取得
  • サードパーティAPI

#例: Google Fonts

<head>
  <!-- フォントのオリジンに事前接続 -->
  <link rel="preconnect" href="https://fonts.googleapis.com">
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>

  <!-- フォントの読み込み -->
  <link href="https://fonts.googleapis.com/css2?family=Roboto&display=swap" rel="stylesheet">
</head>

#注意点

  • 10秒以内に接続を使用しないと、接続が切れる
  • 接続数が多すぎるとCPU/メモリを消費
  • 実際に使用するオリジンにのみ使用(3〜4個まで)

#dns-prefetch

外部サーバーのDNS解決のみを事前に実行します。

<link rel="dns-prefetch" href="https://analytics.example.com">

#preconnectとの違い

dns-prefetchpreconnect
DNS解決
TCP接続
TLS ハンドシェイク
コスト低い中程度

#使用場面

  • 確実に使うわけではないが、使う可能性があるオリジン
  • preconnectでは過剰な場合
  • 多くの外部オリジンがある場合

#例: アナリティクス

<link rel="dns-prefetch" href="https://www.google-analytics.com">

#preconnectとの併用

古いブラウザへのフォールバックとして、両方指定することがあります。

<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="dns-prefetch" href="https://fonts.gstatic.com">

#modulepreload

ES Moduleを先読みし、パースまで行います。

<link rel="modulepreload" href="/app.js">

通常のpreloadと異なり、JavaScriptモジュールとしてパースされ、依存関係も解決されます。

#使い分けガイド

リソースは現在のページで必ず使う?

    ├── Yes → preload
    │         └── 外部オリジン? → preconnect も追加

    └── No → リソースは次のページで使うかも?

              ├── Yes → prefetch

              └── No → 外部オリジンへの接続がある?

                        ├── Yes、確実に使う → preconnect

                        └── Yes、使うかも → dns-prefetch

#DevToolsでの確認

#Networkタブ

  1. リソースをクリック
  2. 「Initiator」列でpreloadが使われているか確認

#Performanceタブ

  1. パフォーマンス記録を取得
  2. 「Timings」セクションで接続時間を確認

#Console

preloadしたリソースが使用されないと警告が表示されます:

The resource ... was preloaded using link preload but not used within a few seconds.

#ベストプラクティス

#1. 重要なリソースに限定

<!-- ✅ LCP画像をpreload -->
<link rel="preload" as="image" href="/hero.webp">

<!-- ❌ すべての画像をpreload(過剰) -->
<link rel="preload" as="image" href="/image1.jpg">
<link rel="preload" as="image" href="/image2.jpg">
<link rel="preload" as="image" href="/image3.jpg">
...

#2. preconnectは3〜4個まで

<!-- ✅ 必要なオリジンのみ -->
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="preconnect" href="https://cdn.example.com" crossorigin>

<!-- ❌ 多すぎる -->
<link rel="preconnect" href="https://origin1.com">
<link rel="preconnect" href="https://origin2.com">
...
<link rel="preconnect" href="https://origin10.com">

#3. 測定して効果を確認

リソースヒントを追加したら、LCPなどの指標が改善したか確認してください。

#まとめ

  • preload: 現在のページで確実に使うリソースを先読み
  • prefetch: 次のページで使うかもしれないリソースをアイドル時に先読み
  • preconnect: 外部サーバーへの接続を事前に確立
  • dns-prefetch: DNS解決のみを事前に実行
  • 過度な使用は逆効果、重要なリソースに限定
  • 効果を測定して確認

#次のステップ

リソースヒントを理解したところで、次はクリティカルレンダリングパスについて学びましょう。ブラウザがHTMLを受け取ってから画面に描画するまでの流れを理解し、レンダリングを最適化する方法を紹介します。

#参考リンク