Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
フロントエンドから触れるHTTPパフォーマンス
Search
Tatsuki Sugiura
August 20, 2025
Technology
18
0
Share
フロントエンドから触れるHTTPパフォーマンス
Tatsuki Sugiura
August 20, 2025
More Decks by Tatsuki Sugiura
See All by Tatsuki Sugiura
103 Early Hints
sugi_0000
1
780
No more parser-inserted js - defer / async を今こそ完全に理解する
sugi_0000
0
84
FLOSSむかしばなし
sugi_0000
0
24
和暦 & 漢数字 gem
sugi_0000
0
42
FLOSS とフリーカルチャーの流れ
sugi_0000
0
27
Git overview
sugi_0000
0
40
飲む方の茶会
sugi_0000
0
24
Other Decks in Technology
See All in Technology
Sansanの認証基盤を支えるアーキテクチャとその振り返り
sansantech
PRO
1
130
ハーネスエンジニアリング×AI適応開発
aictokamiya
3
1.2k
The essence of decision-making lies in primary data
kaminashi
0
200
Zephyr(RTOS)でOpenPLCを実装してみた
iotengineer22
0
180
OPENLOGI Company Profile for engineer
hr01
1
61k
自分をひらくと次のチャレンジの敷居が下がる
sudoakiy
5
1.5k
GitHub Actions侵害 — 相次ぐ事例を振り返り、次なる脅威に備える
flatt_security
12
7.2k
Datadog で実現するセキュリティ対策 ~オブザーバビリティとセキュリティを 一緒にやると何がいいのか~
a2ush
0
180
BFCacheを活用して無限スクロールのUX を改善した話
apple_yagi
0
140
制約を設計する - 非決定性との境界線 / Designing constraints
soudai
PRO
2
220
TUNA Camp 2026 京都Stage ヒューリスティックアルゴリズム入門
terryu16
0
650
不確実性と戦いながら見積もりを作成するプロセス/mitsumori-process
hirodragon112
1
170
Featured
See All Featured
For a Future-Friendly Web
brad_frost
183
10k
Evolving SEO for Evolving Search Engines
ryanjones
0
170
Abbi's Birthday
coloredviolet
2
6.1k
A Modern Web Designer's Workflow
chriscoyier
698
190k
What the history of the web can teach us about the future of AI
inesmontani
PRO
1
500
WENDY [Excerpt]
tessaabrams
9
37k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
2.6k
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
290
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
1
2.5k
Everyday Curiosity
cassininazir
0
180
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
160
Discover your Explorer Soul
emna__ayadi
2
1.1k
Transcript
フロントエンドから触れる HTTPパフォーマンス 2025-08-20 Tatsuki Sugiura <
[email protected]
> <
[email protected]
>
自己紹介 - sugi - Tatsuki Sugiura • 現在 Repro Inc.
で Booster という Web サイト高 速化ツールの開発をしています • 個人では RoR を使った開発や和暦gem とか • ESR の 「ハッカーになろう」から OSS活動をはじめる • 過去に OSDN や スラド (/.j) の開発・運営 • お茶が大好きです!
今日のトピック • 申し訳ない。あんまりモダンJS環境向けの話ではないです! ◦ でも使えるところはあると思う • ページが表示されるまでHTTPの通信復習 • 実はブラウザからHTTP通信の順序に介入する方法あるよ •
コントロールのための具体的方法 • 今日話さないこと ◦ プロトコルの詳細 (パケット, RT, フレーム)
ページが表示されるまで (1) • ページが読み込みから表示完成までに起こっていること ◦ HTML の解釈 ◦ サブリソースの転送
◦ JS の実行
ページが表示されるまで (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) • HTMLは流れてくるものを随時反映 • サブリソースは(基本的には)出現したら転送開始 HTML転送 CSS転送 JS転送 JS実行
画像転送
ページが表示されるまで (4) - レンダリングパス • レンダリングするには以下が必要 ◦ HTML DOM Tree
◦ CSSOM Tree ◦ Sync JS (parser-inserted js) の実行 • HTML は順次反映できるが、 CSS と JS は全体を読みきらない と利用できない • CSS は基本的にその時点でレンダリングをブロックする • Sync JS の実行は先行するレンダーブロッキング CSS の解釈後 まで待たれる (転送は先にできるが、実行はCSS解釈後) • 画像は随時読み込まれる
早くページを表示するには • First view に必要なものを如何に早く読み込むか • 適切な順でサブリソースを読み込む • HTML の後ろにある要素でも、重要なものは早めに読みたい
◦ (例) LCP 画像 • ページ内のサブリソースの依存関係は複雑なため、表示されない ものでも結果的に First View のレンダリングに必要なケースはま まある -> 読み込み順が重要!
どうやって順序をコントロールするの? # 定番で言われること • そもそも HTML上の順序を適切にする ◦ ただし、ブラウザは必ずしも発見次第リクエストするわけではない • 不要なブロッキング要素を置かない
◦ 不要なブロッキングCSSを置かない ◦ JS に適切に asyncをつける # おさえて置くと良いトピック • Priority (Fetch Priority) • Resource Hints (Preload) • Lazy loading (asyc, loading) - 今回話しません
Priority / Fetch priority • ページに必要なリソースの読み込み優先度 • 優先度は複数層で管理されている ◦ ↓
HTML上の指定 ◦ ↓ ブラウザ内の管理 ◦ HTTPのプロトコル上の指定 • HTML属性をつけることで HTTP のプロトコル上の優先度を制御 可能
優先度はなぜ必要? - 並列の定番の落とし穴 • 今のHTTPではリソースを複数ストリームで並列にロードする • もし優先度が同じならすべてを発見次第同時にリクエスト • 帯域は有限なので競合する •
競合するものを並列に 処理にすると結果的に 全てが遅くなる
Priority in browsers • リソースごとに優先度を持つ ◦ Lowest - Low -
Medium - High - Highest の 5段階 • 手軽に Devtools で確認できます
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>
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’} );
HTTP Priority - プロトコル側の機能 • HTTP ストリームは Priority を持っていて優先度が高いものが優 先される
(ことになっている) • ブラウザ内で管理している優先度からマッピング • HTTP/2 は優先度ツリー, HTTP/3 は優先度とincremental https://calendar.perfplanet.com/2022/http-3-prioritization-demystified/
Resource Hints (Preload) • HTML の Link タグで先に読み込むべきリソースを指示 • LCP
画像など実際に利用するHTMLタグが後ろのものを、先にダ ウンロードしておくことができる • CSS, JS, Font など色々使える • ただ、Head 上の方にある js など、すぐに読み込みが始まるもの を指定する意味はあまりない • 不必要なものを指定すぎないこと! 余計遅くなる。 ◦ ブラウザによっては上限を管理している <link rel="preload" href="/lcp-image.jpg" as="image" fetchPriority=“high”>
Resource Hints 補足 • ブラウザによって、優先度の ポリシーが違う • as=”image” の場合は、標 準の
Priority が低い ◦ Chrome だけあげられる https://calendar.perfplanet.com/2022/http-3-prioritizat ion-demystified/
おまけ: もっと効果的なプロトコルレベル Preload • HTML の link rel=”preload” ではなく、Link
ヘッダでも同様の 指定ができる ◦ Chrome だとここでも priority が効く • さらに、103 Early Hints を使えば遥かに早い段階でロードを開 始できる ◦ この場合はメインの CSS や JS のロードをしておくとよい ◦ HTML 内と使い分けると良さそう ◦ 103 自体の悩ましさはある
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 を避ける