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

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

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

 フロントエンドから触れる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 を避ける