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

フロントエンドから触れるHTTPパフォーマンス

 フロントエンドから触れるHTTPパフォーマンス

Avatar for Tatsuki Sugiura

Tatsuki Sugiura

August 20, 2025
Tweet

More Decks by Tatsuki Sugiura

Other Decks in Technology

Transcript

  1. 自己紹介 - sugi - Tatsuki Sugiura
 • 現在 Repro Inc.

    で Booster という Web サイト高 速化ツールの開発をしています
 • 個人では RoR を使った開発や和暦gem とか
 • ESR の 「ハッカーになろう」から OSS活動をはじめる
 • 過去に OSDN や スラド (/.j) の開発・運営
 • お茶が大好きです!

  2. ページが表示されるまで (2) - HTMLパースとDOM構築
 HTML stream <html> <head> <meta charset=....

    Web Server Tokenizer Tree Construction <html> <head> <meta… DOM Tree html head meta link body
  3. ページが表示されるまで (4) - レンダリングパス
 • レンダリングするには以下が必要
 ◦ HTML DOM Tree


    ◦ CSSOM Tree
 ◦ Sync JS (parser-inserted js) の実行
 • HTML は順次反映できるが、 CSS と JS は全体を読みきらない と利用できない
 • CSS は基本的にその時点でレンダリングをブロックする
 • Sync JS の実行は先行するレンダーブロッキング CSS の解釈後 まで待たれる (転送は先にできるが、実行はCSS解釈後)
 • 画像は随時読み込まれる

  4. 早くページを表示するには
 • First view に必要なものを如何に早く読み込むか
 • 適切な順でサブリソースを読み込む
 • HTML の後ろにある要素でも、重要なものは早めに読みたい


    ◦ (例) LCP 画像
 • ページ内のサブリソースの依存関係は複雑なため、表示されない ものでも結果的に First View のレンダリングに必要なケースはま まある
 -> 読み込み順が重要!

  5. どうやって順序をコントロールするの?
 # 定番で言われること
 • そもそも HTML上の順序を適切にする
 ◦ ただし、ブラウザは必ずしも発見次第リクエストするわけではない
 • 不要なブロッキング要素を置かない


    ◦ 不要なブロッキングCSSを置かない
 ◦ JS に適切に asyncをつける
 # おさえて置くと良いトピック
 • Priority (Fetch Priority)
 • Resource Hints (Preload)
 • Lazy loading (asyc, loading) - 今回話しません

  6. Priority / Fetch priority
 • ページに必要なリソースの読み込み優先度
 • 優先度は複数層で管理されている
 ◦ ↓

    HTML上の指定
 ◦ ↓ ブラウザ内の管理
 ◦ HTTPのプロトコル上の指定
 • HTML属性をつけることで HTTP のプロトコル上の優先度を制御 可能

  7. Priority in browsers
 • リソースごとに優先度を持つ
 ◦ Lowest - Low -

    Medium - High - Highest の 5段階
 • 手軽に Devtools で確認できます

  8. Fetch Priority HTML Attribute
 • fetchPriority 属性を追加するだけ
 ◦ 3段階 (auto/low/high)


    • 初期表示に必要なものだけに high をつける
 • 要らないものに low
 • 全部 high にすれば良いというわけ ではないことに注意。余計遅くなる
 
 <div class=”carousel”>
 <img src=”hero1.jpg” fetchPriority=”high” 
 class=”active”>
 <img src=”item2.jpg” fetchPriority=”low”>
 <img src=”item3.jpg” fetchPriority=”low”>
 <img src=”item4.jpg” fetchPriority=”low”>
 </div>

  9. Fetch Priority with JavaScript
 • RequestInit に priority を指定可能
 ◦

    fetch()
 ◦ new Request()
 • コンテンツ表示用APIと、バックグラ ウンド通信APIなどで priority を使い 分けられる
 
 fetch(‘http://localhost/items’, {
 priority: ‘high’
 });
 
 new Request(
 ‘http://localhost/status-ping’,
 {priority: ‘low’}
 );

  10. HTTP Priority - プロトコル側の機能
 • HTTP ストリームは Priority を持っていて優先度が高いものが優 先される

    (ことになっている)
 • ブラウザ内で管理している優先度からマッピング
 • HTTP/2 は優先度ツリー, HTTP/3 は優先度とincremental
 https://calendar.perfplanet.com/2022/http-3-prioritization-demystified/
  11. Resource Hints (Preload)
 • HTML の Link タグで先に読み込むべきリソースを指示
 • LCP

    画像など実際に利用するHTMLタグが後ろのものを、先にダ ウンロードしておくことができる
 • CSS, JS, Font など色々使える
 • ただ、Head 上の方にある js など、すぐに読み込みが始まるもの を指定する意味はあまりない
 • 不必要なものを指定すぎないこと! 余計遅くなる。
 ◦ ブラウザによっては上限を管理している
 <link rel="preload" href="/lcp-image.jpg" as="image" fetchPriority=“high”>

  12. Resource Hints 補足
 • ブラウザによって、優先度の ポリシーが違う
 • as=”image” の場合は、標 準の

    Priority が低い
 ◦ Chrome だけあげられる
 https://calendar.perfplanet.com/2022/http-3-prioritizat ion-demystified/
  13. おまけ: もっと効果的なプロトコルレベル Preload 
 • HTML の link rel=”preload” ではなく、Link

    ヘッダでも同様の 指定ができる
 ◦ Chrome だとここでも priority が効く
 • さらに、103 Early Hints を使えば遥かに早い段階でロードを開 始できる
 ◦ この場合はメインの CSS や JS のロードをしておくとよい
 ◦ HTML 内と使い分けると良さそう
 ◦ 103 自体の悩ましさはある

  14. Lazy load / Async script
 • 画像や iframe を viewport

    に入るまで読み込みを遅延する
 • これにより、必要なものを先に読み込める
 • そろそろ JS 版の lazy load を使うのはやめよう 
 <img src=”item.jpg” loading=”lazy”>
 <script src=”module.js” type=”module”></script>
 <script src=”src.js” async></script>
 <script src=”legacy.js” defer></script>
 • モダンなスクリプトなら module にすると自動で非同期に
 • とにかく Parser-inserted script を避ける