より優れたウェブを構築 - パート 1: ウェブ版 YouTube の高速化

パフォーマンスを改善し、Core Web Vitals の合格率を高め、主要なビジネス指標を向上させるために、YouTube ウェブチームが行った変更の事例紹介。

Addy Osmani
Addy Osmani
Sriram Krishnan
Sriram Krishnan

Chrome チームは「より優れたウェブの構築」とよく言っていますが、これはどういう意味でしょうか?ウェブ エクスペリエンスは高速で、アクセスしやすく、ユーザーが最も必要としている瞬間にデバイス機能を使用できる必要があります。dogfood は Google の文化の一部です。そこで Chrome チームは YouTube と提携し、その過程で得た教訓を「より良いウェブの構築」という新しいシリーズで共有しました。シリーズの第 1 部では、YouTube がどのようにして高速なウェブ体験を構築したかを掘り下げます。

PageSpeed Insights に表示された、YouTube モバイルウェブの Chrome UX レポートのデータが Core Web Vitals に合格していること。
モバイルウェブ向け YouTube の動画再生ページが Core Web Vitals のしきい値を満たしている。

より高速なウェブの構築

YouTube では、パフォーマンスとは、動画や他のコンテンツ(おすすめやコメントなど)がウェブページに読み込まれる速度に関係しています。また、検索、プレーヤーの操作、高評価、共有などのユーザー操作に YouTube が応答する速度によっても測定されます。

ブラジル、インド、インドネシアなど、成長中の市場は YouTube モバイルウェブにとって重要です。これらのリージョンでは多くのユーザーのデバイスが遅く、ネットワーク帯域幅が限られているため、高速でシームレスなエクスペリエンスを実現することが重要な目標です。

すべてのユーザーにインクルーシブなエクスペリエンスを提供するため、YouTube は遅延読み込みとコードのモダナイゼーションを通じて、Core Web Vitals などのパフォーマンス指標の改善に着手しました。

Core Web Vitals の改善

改善の余地がある領域を特定するため、YouTube チームは Chrome ユーザー エクスペリエンス レポート(CrUX)を使用して、モバイルの動画再生ページと検索結果ページが現場で実際にユーザーにどのように利用されているかを調べました。Core Web Vitals の指標には多くの改善の余地があることに気づきました。Largest Contentful Paint(LCP)指標は 4 ~ 6 秒で記録されるケースがありました。これは、目標の 2.5 秒よりも大幅に長くなりました。

YouTube 動画再生ページの合格率と YouTube のオリジンを示す FCP と LCP のグラフ。

改善の余地がある領域を特定するため、Lighthouse を使用して YouTube の動画再生ページを監査したところ、First Contentful Paint(FCP)は 3.5 秒、LCP は 8.5 秒と低い Lighthouse(ラボ)スコアが得られました。

YouTube モバイルの Lighthouse レポート。
Chrome のゴールド スタンダードとして、FCP については 1.8 秒、LCP については 2.5 秒を目標に設定しています。FCP と LCP はそれぞれ 3.5 秒と 8.5 秒ではっきりと黄色と赤色でした。

FCP と LCP を最適化するために、YouTube チームはいくつかの実験を行い、2 つの大きな発見がありました。

  1. 最初の発見は、動画プレーヤーの HTML を、動画プレーヤーをインタラクティブにするスクリプトより上に移動することでパフォーマンスを改善できるということでした。実験では、これが FCP と LCP の両方を 4.4 秒から 1.1 秒に改善できることが示されました。

  2. 2 つ目の発見は、LCP は <video> 要素のポスター画像のみを考慮し、動画ストリーム自体のフレームは考慮しないということです。YouTube はこれまで、動画の再生開始までの時間が最も短くなるように最適化してきました。そこで LCP を改善するために、チームはポスター画像を配信する時間の最適化も開始しました。いくつかのバリエーションのポスター画像を試し、ユーザーテストで最も高いスコアを獲得したポスター画像を選んだ。この作業の結果、FCP と LCP はどちらも著しく改善され、フィールド LCP は 4.6 秒から 2.0 秒に向上しました。

モバイルウェブの動画再生ページの LCP テスト。コントロール、テスト A(画像のサムネイル)、テスト B(黒いサムネイル)を表示
ラボでは、この変更のリリース後、FCP と LCP が 4.4 秒から 1.1 秒に改善されました。テスト A: 実際の動画サムネイルは、動画が一時停止したページではうまく機能しますが、動画再生ページなどの自動再生動画ページでは、ユーザー調査によるとパフォーマンスが下がりました。アクティブ ユーザー数も減少しました。テスト B: ユーザー調査では、黒一地のポスター画像を使用した結果、最も良い結果が得られました。ユーザーは、自動再生動画の場合、黒一色から最初のフレームに切り替わる方が不快に感じないと感じていました。
2021 年 7 月に、この黒いサムネイルがすべてのモバイルウェブ ユーザーに向けて本番環境にデプロイされました。上記の RUM 分析で明らかなように、FCP と LCP が著しく改善されました。
2021 年 7 月にすべてのモバイルウェブ ユーザーに対して黒いサムネイルが本番環境にデプロイされ、上記の RUM 分析で明らかなように、FCP と LCP が著しく改善されました。

こうした最適化によって LCP は改善されましたが、現在の LCP 指標の定義では、ページの「メイン コンテンツ」が読み込まれたとき(LCP の目標)がユーザーの視点から完全には把握できていないと感じました。

こうした懸念に対処するため、YouTube チームのメンバーと Chrome チームのメンバーが協力し、LCP 指標を改善してユースケースに対処する方法を探りました。いくつかの選択肢の実現可能性と影響を検討した結果、チームは LCP の候補として動画要素の最初のフレームのペイント時間を検討するための提案に行きつきました。

この変更が Chrome に反映されると、YouTube チームは LCP の最適化に引き続き取り組んでまいります。また、指標の更新版により、これらの最適化が実際のユーザー エクスペリエンスにより直接的に影響を及ぼします。

遅延読み込みによるモジュール化

YouTube のページには、積極的に読み込まれたモジュールが数多く含まれていました。50 以上のコンポーネントのレンダリングを最適化するために、チームは、読み込むモジュールをクライアントに伝えるコンポーネントを JS モジュールにマッピングしました。コンポーネントを Lazy としてマークすると、JS モジュールが後で読み込まれるようになり、ページの初回読み込み時間と、クライアントに送信される未使用の JavaScript の量が削減されます。

しかし、遅延読み込みの実装後、遅延読み込みのコンポーネントとその依存関係が最適でないタイミングで読み込まれるウォーターフォール効果に気づきました。

この問題を解決するために、チームはビューに必要な最小限のコンポーネント セットを決定し、1 つのネットワーク リクエストにバッチ処理しました。その結果、ページ速度が向上し、JavaScript の解析時間が短縮され、ひいては初期レンダリング時間も短縮されました。

コンポーネント間の状態管理

特に古いデバイスで、YouTube のプレーヤー コントロールが原因でパフォーマンスの問題が発生していました。コード分析により、再生速度や進行状況などの機能をユーザーが制御できるプレーヤーが、時間の経過とともに過度にコンポーネント化されていることがわかりました。

YouTube のプレーヤーとコントロールの可視化
YouTube 動画プレーヤーでは、再生速度の調整、進行状況のフォロー、セクションのスキップなどができます。ユーザーが特定のコントロールをタップしたとき、状態の変化を他のコントロールに通知する必要があります。たとえば、ユーザーが進行状況バーをタップしたときには、再生ヘッドや字幕などのコントロールと共有する必要があります。

進行状況バーのタップ移動イベントごとにスタイルの追加再計算が 2 回トリガーされ、ラボでのパフォーマンス テスト実行中に 21.17 ミリ秒かかりました。時間の経過とともに新しいコントロールが追加されるにつれて、分散コントロールのパターンは循環依存関係とメモリリークを引き起こし、動画再生ページのパフォーマンスに悪影響を及ぼしていました。

パフォーマンス タイムラインに 21.17 ms のイベントを表示。
CPU パフォーマンスが 4 倍に低下する Chrome DevTools を実行します。

制御の分散による問題を解決するために、チームはすべての更新を同期するようにプレーヤー UI を更新しました。つまり、基本的には、子にデータを渡す 1 つのトップレベル コンポーネントにプレーヤーをリファクタリングしました。これにより、状態変化に対して UI 更新(レンダリング)サイクルが 1 つだけになり、更新の連鎖が不要になりました。新しいプレーヤーの進行状況バーのタッチ移動イベントでは、JavaScript の実行中にスタイルの再計算は行われず、古いプレーヤーの 25% の時間のみが必要になりました。

パフォーマンスのタイムラインに表示されるアクティビティの時間が短縮されます。

また、このコードのモダナイゼーションにより、古いデバイスでのスマートウォッチの読み込み時間の改善、放棄された再生の減少、致命的でないエラーの減少など、さらなるパフォーマンスの向上も実現しました。

おわりに

YouTube がパフォーマンスに投資した結果、動画再生ページの読み込み速度が大幅に向上し、現在、YouTube のモバイルサイトの URL の 76% が Core Web Vitals の指標のしきい値を満たしています。パソコンでは、動画再生ページのラボ LCP が約 4.6 秒から 1.6 秒に短縮されました。サイトの操作とレンダリングのパフォーマンス、特に YouTube 動画プレーヤーでは、JavaScript の実行時間が以前と比べて最大 75% 短縮されています。

この 1 年間で YouTube ウェブのパフォーマンスが向上したことで、総再生時間や 1 日のアクティブ ユーザー数などのビジネス指標も改善されました。こうした取り組みの成果を踏まえ、今後もさらなる最適化の方法を探っていきたいと考えています。

このシリーズのパート 2「アクセシビリティの高いウェブの構築」では、スクリーン リーダーのユーザーがウェブサイトをより利用しやすくするために、YouTube がどのようにしてウェブサイトを改善したかをご紹介します。

この作業に協力してくれた Gilberto Cocchi、Lauren Usui、Benji Bear、Bo Aye、Bogdan Balas、Kenny Tran、Matthew Smith、Phil Harnish、Leena Sahoni、Jeremy Wagner、Philip Walton、Harleen Batra、ならびに YouTube チームと Chrome チームの両方に深く感謝します。