Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ブラウザの投機的読み込みと投機ルールAPIを理解し、Webサービスのパフォーマンスを最適化する

Sponsored · SiteGround - Reliable hosting with speed, security, and support you can count on.

 ブラウザの投機的読み込みと投機ルールAPIを理解し、Webサービスのパフォーマンスを最適化する

Avatar for did0es

did0es

May 08, 2026

More Decks by did0es

Other Decks in Technology

Transcript

  1. Hirai Shuta | did0es(🗣 ディドス) SWE, Next Experts(Client - TypeScript)

    @ CyberAgent, Inc. FEC Tokyo lead organizer & FEC Nagoya adviser For more: did0.es
  2. 投機的読み込み機能の種類 1. <link rel="dns-prefetch"> 2. <link rel="preconnect"> 3. <link rel="preload">

    4. <link rel="modulepreload"> 5. ⚠ <link rel="prefetch"> 6. ⚠🗑 <link rel="prerender"> 7. 🧪 投機ルール API a. 先読み b. 事前レンダリング
  3. ① <link rel="dns-prefetch"> • DNS解決を事前に⾏う ◦ 対象オリジンのドメイン名をIPアドレスに解決するまでの待ち時間を短縮 ◦ DNSキャッシュとは別 •

    同⼀オリジンのリクエストではメリットなし ◦ 同⼀オリジンであれば既にコネクションが開いている(ドメインのIP解決済み) • 使い⽅ ◦ 例:<link rel="dns-prefetch" href="https://example.com" /> ◦ HTTPヘッダのLinkでも設定可能: Link: <https://fonts.googleapis.com/>; rel=dns-prefetch
  4. ② <link rel="preconnect"> • 接続ハンドシェイクの⼀部またはすべてを事前に⾏う ◦ DNS解決 + α の事前実⾏

    ◦ HTTPのオリジン:DNS + TCP ◦ HTTPSのオリジン:DNS + TCP + TLS • 同⼀オリジンのリクエストではメリットなし ◦ 同⼀オリジンであれば既にコネクションが開いている(ドメインのIP解決済み) • 使い⽅ ◦ 例:<link rel="preconnect" href="https://example.com" /> ◦ HTTPヘッダのLinkでも設定可能: Link: <https://fonts.googleapis.com/>; rel=preconnect
  5. ③ <link rel="preload"> • 指定したリソースのダウンロードとキャッシュを⾏う ◦ ブラウザがレンダリングを開始する前に必要であることを⽰唆 ◦ 実⾏はしない •

    使い⽅ ◦ 例:<link rel="preload" href="style.css" as="style" /> ◦ as属性にはリソースの種類(fetch, font, image, script, style, trackが設定可能) ◦ MIMEタイプによる制御や、CORSによる取得(fontファイルなどで利⽤)、 media属性によるレスポンシブな事前読み込みが可能
  6. prerenderとprefetchが抱える問題 • Cache-Controlヘッダーにブロックされる可能性がある ◦ no-cache, no-storeなど • ブラウザのキャッシュ分割で無効になる ◦ 同⼀ドメインでもキャッシュ共有できない:

    あるリソースに対してa.example.comでprerender/prefetchした結果は、 b.example.comから⾒えない • prerenderのセキュリティ ◦ プロセス間のアクセス制御が⼗分に考慮できていない
  7. ⑦ 🧪 投機ルールAPI • 前述の問題を解決するAPI • 先読み:prefetchの代替 ◦ ドキュメント単位でメモリにキャッシュ •

    事前レンダリング:prerenderの代替 ◦ 先読み + αでレンダリング ◦ ⾮表⽰タブに読み込んでメモリにキャッシュ • 使い⽅ ◦ 投機ルールをJSON形式で記述 ▪ <script type="speculationrules">にインラインで記述 ▪ Speculation-Rulesヘッダーで記述したファイルを指定
  8. 投機ルールAPIを使う上での注意(※) • 先読み ◦ GETリクエストが⾶ぶ ▪ サーバー側がGETリクエスト駆動で何か処理する場合動いてしまう ◦ キャッシュを表⽰するため、リアルタイム性が損なわれる ▪

    サーバー側でレンダリングされた結果とユーザーの操作結果との不整合 • 事前レンダリング ◦ ユーザーが操作したかのような動作をする場合がある ▪ 画像の読み込み、トラッキングスクリプトの実⾏など ◦ JSによる副作⽤が他のページに⼲渉 ▪ ブラウザのストレージを使う処理など ※ prefetch / prerenderでもこれらに注意が必要
  9. 投機的読み込み機能の使い分け • 汎⽤的 ◦ dns-prefetch ◦ preconnect • アセット多め ◦

    preload • SPA:管理画⾯ ◦ modulepreload ◦ prefetch(投機ルールAPIの先読み) • MPA:メディア、検索サイト ◦ 投機ルールAPI