Slide 1

Slide 1 text

Priorityを制するものは ローディングを制す Edward Fox 2023/09/26 We Are JavaScripters! @42nd

Slide 2

Slide 2 text

はじめに ● Reproという会社で「Repro Booster」というプロダクトの企画・開発をやってます ○ 「タグを入れるだけでサイトが速くなる」というサービス ○ ServiceWorkerとか色々使って、コンテンツの先読みや最適化を自動で行う ● コンテンツの自動最適化を図っていく上で、リクエストのPriorityを詳しく理解する 必要があったので、そこで学んだことについて話します

Slide 3

Slide 3 text

ローディングの優先順位

Slide 4

Slide 4 text

ローディングの優先順位

Slide 5

Slide 5 text

ローディングの優先順位

Slide 6

Slide 6 text

ローディングの優先順位 限られた帯域を利用して どのリソースをどういう順番・ 優先順位でダウンロードし 利用可能な状態にすべきか (≠ JSの実行順序)

Slide 7

Slide 7 text

ローディングの優先順位 ・CSSとスクリプトはどっちが大事? ・ロゴ画像とLCP画像はどっちが優先? ・defer1.jsとdefer2.jsはどっちが先? ・遅延読み込みの画像が viewport内に 入ってたら優先する? ・asyncはdeferより後回しでOK? ・コンテンツを書き換える可能性の ある fetch() はどう扱う?

Slide 8

Slide 8 text

ローディングの優先順位 = Priority ・CSSとスクリプトはどっちが大事? ・ロゴ画像とLCP画像はどっちが優先? ・defer1.jsとdefer2.jsはどっちが先? ・遅延読み込みの画像が viewport内に 入ってたら優先する? ・asyncはdeferより後回しでOK? ・コンテンツを書き換える可能性の ある fetch() はどう扱う?

Slide 9

Slide 9 text

● Priority Hints ○ Renderer側の制御(ブラウザのタブ、JSランタイム) ● Priority Header ○ ネットワーク側の制御 ● 文字通り、通信の「優先度」を制御するための情報 ● 完全な制御は担保されず、文字通り「ヒント」を提供する程度のもの Priority をコントロールする (1)

Slide 10

Slide 10 text

Priority をコントロールする (1) ブラウザ Renderer Process Browser Process Server

Slide 11

Slide 11 text

Priority をコントロールする (1) ブラウザ Renderer Process Browser Process Server Priority Header (frame) Priority Hints

Slide 12

Slide 12 text

Priority をコントロールする (1) ブラウザ Renderer Process Browser Process Server Priority Hints Priority Header (frame)

Slide 13

Slide 13 text

● クライアントからサーバーにリソースの優先度を伝えるための情報 ● HTTP/2ではPriorityフレームという形でストリームの優先度を制御するものとし て存在していたが、RFCによるとサーバー側の実装が進まなかったとして deprecatedされた ● HTTP/3ではPriorityヘッダとして実現された ○ 0-7の urgency と boolean の increment という2つのフィールドで構成される ○ 優先度が変わったときのために Priority Update フレームというのも存在する Priority Header/Frame (1)

Slide 14

Slide 14 text

Priority Header/Frame (2)

Slide 15

Slide 15 text

Priority Header/Frame (2)

Slide 16

Slide 16 text

● サーバー側の実装(ヘッダ、フレームの解釈)に大きく依存する ● ブラウザ側の送信方法もだいぶ違う ○ Safari/Firefox は HTTPヘッダとして送る ○ Chrome はヘッダではなく PRIORITY_UPDATE フレームとして送る Priority Header/Frame (3)

Slide 17

Slide 17 text

Priority をコントロールする (2) ブラウザ Renderer Process Browser Process Server Priority Header (frame) Priority Hints

Slide 18

Slide 18 text

Priority をコントロールする (2) ブラウザ Renderer Process Browser Process Server Priority Hints Priority Header (frame)

Slide 19

Slide 19 text

と記述することでリソースの読み込み優先度を制御する ● LCPを上げる施策として割と有効 ○ LCP = Largest Contentful Paint ● linkとかiframe要素にも使えるので、必要に応じて画像以外にも付与するのが吉 ○ ただしCSSは基本的にどのブラウザでも(そのブラウザが持つ優先度制御の中で)最優先されるので、全部の に fetchPriority をつけて回る作業は不要 Priority Hints (1): fetchPriority

Slide 20

Slide 20 text

Priority Hints (2): fetch API ● fetch(url, { priority: ‘high’ }) と書くことで通信の優先度を制御できる ● 画像などの要素に限らず、Fetch API を利用し通信を行う際に指定できる ● high, low, auto が指定可能(無指定 = auto) ● Firefox, Safari では非対応 ● 用途がハッキリしたユースケース以外は無指定(auto)で良さそう

Slide 21

Slide 21 text

ブラウザ間の差 ( js )

Slide 22

Slide 22 text

ブラウザ間の差 ( image )

Slide 23

Slide 23 text

ブラウザ間の差 ( image )

Slide 24

Slide 24 text

ブラウザ間の差 ( image )

Slide 25

Slide 25 text

● Webサイトのパフォーマンスを考える上でローディングの優先順位は重要 ● Priority について理解してローディングを最適化しよう ● まずは fetchPriority の活用から ○ Safari リリース版にそのうち載る...と信じましょう ● の loading=lazy や decoding=async などもあります まとめ

Slide 26

Slide 26 text

このあたりのキーワードに引っかかる人はぜひ懇親会でお話しましょう 🚀 ● ServiceWorker ● HTTP, CDN ● Resource Hints, Priority Hints ● パフォーマンス, Core Web Vitals ● プロダクトマネジメント, 新規事業, データ分析・統計 Let’s talk!

Slide 27

Slide 27 text

Additional Resources ● WICG/priority-hints – Priority Hints ● Optimizing resource loading with the Fetch Priority API ● LCP attribution: a fetchpriority breakdown ● fetch() global function ● HTTP/3 Prioritization Demystified ● Adopting a new approach to HTTP prioritization