ブログ

Lighthouseスコア100への道②:体感速度が爆速に!プリロード(preload)徹底活用術

2025.04.14 : Yamamoto Naoki
Coding

Webサイトの表示速度は、ユーザーがページを開いてから「意味のあるコンテンツ」がどれだけ速く表示されるかで決まります。この「意味のあるコンテンツ」の表示を司るのが、クリティカルレンダリングパスです。

シリーズ「Lighthouseスコア100への道」の第2弾となる今回は、このクリティカルレンダリングパスを最適化し、Lighthouseのスコアを飛躍させる強力な武器、「リソースのプリロード(preload)」について、その仕組みから具体的な活用法までを掘り下げて解説します。

なぜページの表示は遅れるのか?レンダリングの仕組み

ブラウザがページを表示するまでには、以下のようなプロセスを経ています。

  1. サーバーからHTMLファイルを受け取る。
  2. HTMLを上から順に解析し、DOM(Document Object Model)ツリーを構築する。
  3. 解析の途中で<link rel=”stylesheet”>や<script>タグを見つけると、CSSやJavaScriptファイルのリクエストを開始する。
  4. CSSのダウンロードと解析が終わると、CSSOM(CSS Object Model)ツリーを構築する。
  5. DOMとCSSOMが揃って初めて、レンダリングツリーが構築され、画面への描画が開始される。

ここでのボトルネックは、ステップ3でCSSやJavaScriptを見つけるまで、それらのダウンロードを開始できない点です。特に、ページの見た目を決めるCSSや、ページの骨格を組み立てる重要なJavaScriptは、1秒でも早くダウンロードを始めたい「クリティカルリソース」です。これらの読み込みが遅れると、画面が真っ白な時間が長引いたり、レイアウトが崩れた状態で表示されたりして、ユーザー体験を損ないます。

救世主 rel=”preload” とは?

そこで登場するのが<link rel=”preload”>です。

これは、HTMLの<head>内に記述することで、ブラウザに対して「このリソースは、このページの表示に後で必ず必要になるから、他のことをしている間に、高い優先度でダウンロードだけ先に済ませておいて!」と伝えるための指示です。

preloadを使うと、ブラウザはHTMLの解析を続けながら、並行して指定されたリソースのダウンロードを開始します。これにより、実際にそのリソースが必要になったときには、既にダウンロードが完了しているか、かなり進んでいる状態になり、待ち時間を大幅に短縮できるのです。

基本的な構文は以下の通りです。

<link rel="preload" href="path/to/resource" as="resource-type">
  • href: リソースのパスを指定します。
  • as: 非常に重要な属性です。 リソースの種類(style, script, font, imageなど)を明示します。これを正しく指定することで、ブラウザはリソースに対して適切な優先順位付けやセキュリティポリシーを適用できます。

何を、どのようにプリロードするべきか?

preloadは強力ですが、無闇に使うと逆効果になることもあります。ここでは、Lighthouseスコア改善に直結する効果的な使い方を3つ紹介します。

1. レンダリングをブロックするCSSのプリロード

通常、CSSはレンダリングをブロックします。これを回避する一般的な手法として、「クリティカルCSS(ページの初期表示に必要な最小限のCSS)をHTMLにインラインで埋め込み、残りのメインCSSは非同期で読み込む」という方法があります。

この非同期読み込みの際にpreloadが真価を発揮します。

<head>
  <link rel="preload" href="style.css" as="style">

  <style>
    /* body { background: #eee; } ...など最小限のスタイル */
  </style>

  <link rel="stylesheet" href="style.css" media="print" onload="this.media='all'">
</head>

このコードは、まずpreloadでstyle.cssのダウンロードを最優先で開始させます。同時に、media=”print”というトリックを使って、ブラウザに「これは印刷用のCSSだから、画面表示はブロックしないでね」と思わせておき、ダウンロード完了後(onloadイベント)にmedia=”all”に切り替えてスタイルを適用します。

これにより、「レンダリングを妨げるリソースの除外」というLighthouseの指摘に対応できます。

2. Webフォントのプリロード

第1回の記事で解説したWebフォントも、プリロードの絶好の対象です。CSSファイルが読み込まれて、その中の@font-faceが解析されてからフォントのダウンロードが始まる、という遅延を解消できます。

<head>
  <link rel="preload" href="/fonts/noto-sans-jp.woff2" as="font" type="font/woff2" crossorigin>

  <link href="https://fonts.googleapis.com/css2?family=Noto+Sans+JP&display=swap" rel="stylesheet">
</head>

as=”font”とcrossorigin属性を忘れずに指定するのがポイントです。display=swapと組み合わせることで、代替フォントが表示される時間(FOUT)をさらに短縮し、よりスムーズな表示を実現できます。

3. LCP(Largest Contentful Paint)画像のプリロード

Lighthouseの重要な指標であるLCPは、「ビューポート内で最も大きなコンテンツが表示されるまでの時間」です。多くの場合、これはページのメインビジュアル(ヒーローイメージ)になります。

このLCPになりうる画像をプリロードすることで、LCPスコアを劇的に改善できます。

<head>
  <link rel="preload" as="image" href="hero-image.webp">
</head>
<body>
  <img src="hero-image.webp" alt="素晴らしいヒーローイメージ">
</body>

ブラウザが<img>タグにたどり着くずっと前からダウンロードを開始できるため、画像の表示が格段に速くなります。

プリロードの注意点:「諸刃の剣」であることを忘れずに

preloadは万能薬ではありません。使い方を誤ると、パフォーマンスを悪化させる可能性があります。

  • 何でもプリロードしないこと: preloadはブラウザに「最優先で!」とお願いする強力な指示です。本当にクリティカルなリソースだけに絞りましょう。不要なものまでプリロードすると、本当に重要なリソースの帯域を奪ってしまい、かえって表示が遅くなります。
  • プリロードしたリソースは必ず使用すること: preloadで指定したにもかかわらず、そのページで結局使われなかった場合、無駄なダウンロードが発生したことになります。Chromeのデベロッパーツールは、このような場合にコンソールで警告を出してくれます。
  • 二重ダウンロードに注意: preloadはあくまでダウンロードを先行させるだけです。実際にリソースを適用するには、別途<link rel=”stylesheet”>や<script>タグなどが必要です。

まとめ

プリロードは、ブラウザの動作を先読みしてリソースの読み込みを最適化する、非常に強力なパフォーマンス改善手法です。

  • CSSのプリロードでレンダリングブロックを防ぐ
  • WebフォントのプリロードでFOUTを短縮する
  • LCP画像のプリロードでコアウェブバイタルのスコアを向上させる

これらのテクニックを正しく使えば、ユーザーの体感速度は劇的に向上し、Lighthouseスコア100がぐっと近づくはずです。

次回は、パフォーマンスチューニングの基本に立ち返り、「JS/CSSの圧縮と、次世代画像フォーマットWebP」について解説します。お楽しみに!

アーカイブ

資料ダウンロード 制作依頼・ご相談
イメージ:制作依頼・ご相談
イメージ:制作依頼・ご相談