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

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

 ブラウザの投機的読み込みと投機ルール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