PWA Night 2021で発表したセッションです。 https://conf2021.pwanight.jp/speaker/hamada/
今回は、GYAO!トップページのWEBパフォーマンスの改善をケーススタディとして、PWAに必須なパフォーマンス改善の具体例を見ていきます。大規模な構成変更と、その成果として得られたスケーラビリティ、ページの表示速度の向上についてをお話しします。
©2021 Yahoo Japan Corporation All rights reserved.GYAO!TOPページ パフォーマンス改善GraphQLアーキテクチャへの移⾏とその後ヤフー株式会社 浜⽥ 真成2021/06/26
View Slide
©2021 Yahoo Japan Corporation All rights reserved.公開このセッションについてPWAの重要な要件にパフォーマンスがあります。今回はGYAO!トップページのWEBパフォーマンスの改善施策をご紹介します。⼤規模な構成変更と、その成果として得られたスケーラビリティ、ページの表⽰速度の向上について、具体例を交えてお話しします。改善⽅法、具体的に伝えます。ぜひ⾊々質問してください。
公開©2021 Yahoo Japan Corporation All rights reserved.⽬次1. GYAO!トップページの特徴2. 2つの課題と解決のアプローチ•APIの拡張性の改善•表⽰パフォーマンスの改善3. 結果とビジネスインパクト4. 考察と今後のアクション3
公開©2021 Yahoo Japan Corporation All rights reserved.⾃⼰紹介4浜⽥ 真成フロントエンド領域を中⼼にGYAO!で技術リードをしています。ヤフー全社横断でWebパフォーマンス改善PJを推進中。Twi$er: @narirow
©2021 Yahoo Japan Corporation All rights reserved.公開1. GYAO!トップページの特徴5
公開©2021 Yahoo Japan Corporation All rights reserved.GYAO!のトップページ6豊富な作品ラインナップから、ユーザーの趣向に合わせた作品を並べる。• レコメンデーション• ターゲティング• 複雑な機能• ⼤量の画像が存在• 縦にとても⻑いページ構成1.GYAOトップページの特徴
©2021 Yahoo Japan Corporation All rights reserved.公開7
©2021 Yahoo Japan Corporation All rights reserved.公開2. 2つの課題と解決のアプローチ8
公開©2021 Yahoo Japan Corporation All rights reserved.2つの課題2. 2つの課題と解決のアプローチ9GYAO!のトップページを運⽤するにあたって、⼤きく2点が課題に上がりました。1: APIの拡張性の低下 2: 表⽰パフォーマンスの悪化(Core Web Vitals)API開発がボトルネックになり、開発が遅延。ページ表⽰までの速度が遅く、⽬的のページに到達できない。
公開©2021 Yahoo Japan Corporation All rights reserved.2. 2つの課題と解決のアプローチ101: APIの拡張性の低下 2: 表⽰パフォーマンスの悪化(Core Web Vitals)API開発がボトルネックになり、開発が遅延。ページ表⽰までの速度が遅く、⽬的のページに到達できない。
公開©2021 Yahoo Japan Corporation All rights reserved.課題1: API拡張性の低下2. 2つの課題と解決のアプローチ11BFF(Backends for Frontend)を採⽤した構成。これまでの構成データの取得が複雑化、仕様がBFFに⼀極集中し開発のボトルネックに
公開©2021 Yahoo Japan Corporation All rights reserved.解決: API拡張性の低下2. 2つの課題と解決のアプローチ12GraphQL Gatewayアーキテクチャを採⽤した構成。現在の構成
公開©2021 Yahoo Japan Corporation All rights reserved.GraphQL Gateway のメリット①2. 2つの課題と解決のアプローチ13GraphQL Schema がサービス全体の型定義となり、開発者が各マイクロサービスをシームレスに接続できる。(クライアントからは、graphql-codegenを使⽤して型安全に接続しています)Gatewayがサービス全体の「型」として機能クライアントクライアントクライアントSchema Registoryマイクロサービスマイクロサービスマイクロサービス
公開©2021 Yahoo Japan Corporation All rights reserved.GraphQL Gateway のメリット②2. 2つの課題と解決のアプローチ14各クライアントそれぞれの要件に応じた、柔軟なクエリを発⾏できる。クエリ定義の柔軟さによって、責務の集中を回避BFFクライアントの責務 データ提供の責務刷新前刷新後GraphQL Query
公開©2021 Yahoo Japan Corporation All rights reserved.2. 2つの課題と解決のアプローチ151: APIの拡張性の低下 2: 表⽰パフォーマンスの悪化(Core Web Vitals)API開発がボトルネックになり、開発が遅延。ページ表⽰までの速度が遅く、⽬的のページに到達できない。
公開©2021 Yahoo Japan Corporation All rights reserved.課題2: 表⽰パフォーマンス(CoreWebVitals数値) の悪化2. 2つの課題と解決のアプローチ16読み込みパフォーマンスメインコンテンツが表⽰されるまでの時間インタラクティブ性ユーザーが操作可能になるまでの時間視覚的安定性レイアウトのガタつきをスコア化CoreWebVitalsは、Googleが提唱するWebページのパフォーマンス品質をスコアリングする指標。指標は現時点のものであり、時代とともに変更される。
公開©2021 Yahoo Japan Corporation All rights reserved.課題2: 表⽰パフォーマンス(CoreWebVitals数値) の悪化2. 2つの課題と解決のアプローチ17GYAO!で特に問題となっていたのは、LCPとCLSの2項⽬。ユーザーが映像に辿り着く前にページを離脱する⼀因に
公開©2021 Yahoo Japan Corporation All rights reserved.GYAO!のトップページのパフォーマンス課題182. 2つの課題と解決のアプローチ1. データの⾮正規化とキャッシュ2. GraphQLを使⽤して初期画⾯に必要なデータだけ取得3. WebPの採⽤による画像サイズの削減と遅延読み込み4. preloadによる画像の事前読み込み5. 広告のレイアウトシフトの改善6. 逐次読み込みのレイアウトシフトの改善
公開©2021 Yahoo Japan Corporation All rights reserved.施策1: データの⾮正規化19各マイクロサービスでは、作品の情報更新が⾏われたタイミングでメッセージキューにイベントを発⾏し、データを⾮正規化。(更新遅延は許容)2. 2つの課題と解決のアプローチ完成形のデータを各サービスで保持し、⾼速にレスポンスを返す
公開©2021 Yahoo Japan Corporation All rights reserved.GYAO!のトップページのパフォーマンス課題201. データの⾮正規化とキャッシュ2. GraphQLを使⽤して初期画⾯に必要なデータだけ取得3. WebPの採⽤による画像サイズの削減と遅延読み込み4. preloadによる画像の事前読み込み5. 広告のレイアウトシフトの改善6. 逐次読み込みのレイアウトシフトの改善2. 2つの課題と解決のアプローチ
公開©2021 Yahoo Japan Corporation All rights reserved.施策2: 初期画⾯に必要なデータだけ取得21GraphQLを使⽤して初期画⾯で必要なクエリのみを取得するようにして、⼤幅にデータ削減。2. 2つの課題と解決のアプローチ
©2021 Yahoo Japan Corporation All rights reserved.公開22実際のクエリ (GraphQLで初期画⾯に必要なクエリだけを読み込む)スクロールしたら、また別のクエリを発⾏。
公開©2021 Yahoo Japan Corporation All rights reserved.施策2: 初期画⾯に必要なデータだけ取得23初期に必要なデー得は requestIndleCallback を使⽤して遅延させるように。複雑な処理は、ユーザー操作が可能になったタイミング後に⾏う独⾃Hookを作成。2. 2つの課題と解決のアプローチℹ Next.js 11で導⼊された next/script では、strategyにlazyOnLoadやafterInteractiveを指定すると同等のことができる。window.requestIdleCallback(() => {// サードパーティスクリプトなど遅延実⾏したい処理を記述},{ timeout: 3000 });
公開©2021 Yahoo Japan Corporation All rights reserved.GYAO!のトップページのパフォーマンス課題242. 2つの課題と解決のアプローチ1. データの⾮正規化とキャッシュ2. GraphQLを使⽤して初期画⾯に必要なデータだけ取得3. WebPの採⽤による画像サイズの削減と遅延読み込み4. preloadによる画像の事前読み込み5. 広告のレイアウトシフトの改善6. 逐次読み込みのレイアウトシフトの改善
公開©2021 Yahoo Japan Corporation All rights reserved.施策3: WebPの採⽤と遅延読み込み252. 2つの課題と解決のアプローチ画像の遅延読み込みを実現するとともに、WebP形式を採⽤。全体で約20%程度のファイルサイズ削減に。
公開©2021 Yahoo Japan Corporation All rights reserved.施策3: WebPの採⽤と遅延読み込み262. 2つの課題と解決のアプローチWebPフォーマットが適⽤可能かクライアントサイドで判定を⾏った後、画像フォーマット/サイズを変換する⾃社サービスを通して提供する。画像変換サーバー オリジンクライアントhttps:// [画像URL] ? w=[幅] &h=[⾼さ] &fmt=[画像フォーマット] &q=[クオリティ]WebP判定: Accept-Headerまたは 機能判定WebP
公開©2021 Yahoo Japan Corporation All rights reserved.GYAO!のトップページのパフォーマンス課題272. 2つの課題と解決のアプローチ1. データの⾮正規化とキャッシュ2. GraphQLを使⽤して初期画⾯に必要なデータだけ取得3. WebPの採⽤による画像サイズの削減と遅延読み込み4. preloadによる画像の事前読み込み5. 広告のレイアウトシフトの改善6. 逐次読み込みのレイアウトシフトの改善
公開©2021 Yahoo Japan Corporation All rights reserved.施策4: preloadによる画像の事前読み込み282. 2つの課題と解決のアプローチここの画像がLCPLCPにあたるTOP画像だけは遅延読み込みをせず、を使⽤していち早く読み込みを⾏う。LCPが1秒以上短縮する結果に。
公開©2021 Yahoo Japan Corporation All rights reserved.施策4: preloadによる画像の事前読み込み292. 2つの課題と解決のアプローチここの画像がLCP画像の遅延読み込みや、preloadによる画像の事前読み込みは、画像⽤の独⾃コンポーネントを作成して対応。ℹ next/image + imgxなどのサービスを使⽤して、同等のことが実現可能です。src={thumbnailUrl} // 画像URLwidth={thumbnailWidth} // 画像の幅height={thumbnailHeight} // 画像の⾼さalt={alt}type={type}preload // 先読み込みするかどうか/>
©2021 Yahoo Japan Corporation All rights reserved.公開30LCPの画像を遅延なしでreloadして読み込む処理画像ライブラリ内
公開©2021 Yahoo Japan Corporation All rights reserved.GYAO!のトップページのパフォーマンス課題312. 2つの課題と解決のアプローチ1. データの⾮正規化とキャッシュ2. GraphQLを使⽤して初期画⾯に必要なデータだけ取得3. WebPの採⽤による画像サイズの削減と遅延読み込み4. preloadによる画像の事前読み込み5. 広告のレイアウトシフトの改善6. 逐次読み込みのレイアウトシフトの改善
公開©2021 Yahoo Japan Corporation All rights reserved.施策5: 広告のレイアウトシフトの改善322. 2つの課題と解決のアプローチレイアウトシフト(要素のガタつき)が「広告」の表⽰で発⽣。PC広告Mobile広告デバイス種別に応じて予め余⽩を確保した状態で広告を表⽰することでCLSをゼロに。
公開©2021 Yahoo Japan Corporation All rights reserved.施策5: ホバーアニメーションのレイアウトシフトの改善332. 2つの課題と解決のアプローチCSS Transitionを⽤いてマウスホバー時に拡⼤アニメーションを⾏っていた箇所が意図せずCLSとして検知。明⽰的に初期値のスタイルを記述することでCLSをゼロに。(最終的に今回はアニメーションを削除しました。)
公開©2021 Yahoo Japan Corporation All rights reserved.GYAO!のトップページのパフォーマンス課題342. 2つの課題と解決のアプローチ1. データの⾮正規化とキャッシュ2. GraphQLを使⽤して初期画⾯に必要なデータだけ取得3. WebPの採⽤による画像サイズの削減と遅延読み込み4. preloadによる画像の事前読み込み5. 広告のレイアウトシフトの改善6. 逐次読み込み処理の改善
公開©2021 Yahoo Japan Corporation All rights reserved.施策6: 逐次読み込み処理の改善35逐次読み込みをした後、ローディングアイコンやフッター要素が下⽅向に移動し、CLSとして検出されてしまう。(多くのサイトで頻発している) ここにコンテンツが差し込まれる逐次読み込みの完了を検出してからフッター要素を挿⼊することでCLSをゼロにする。フッターが下⽅向にずれる2. 2つの課題と解決のアプローチ
公開©2021 Yahoo Japan Corporation All rights reserved.施策6: 逐次読み込みにおけるレイアウトシフトの改善36main/footerのHTML構造を維持して挿⼊するためにɺReact PortalΛ༻͢Δɻ// 逐次読み込みモジュールの終端// 逐次読み込みモジュールの終端2. 2つの課題と解決のアプローチ
©2021 Yahoo Japan Corporation All rights reserved.公開3. 結果とビジネスインパクト37
公開©2021 Yahoo Japan Corporation All rights reserved.サーバーからの応答速度が向上383. 結果とビジネスインパクト基準 刷新前 刷新後 結果サーバーからのレスポンス(TTFB)約930ms 約330ms 約600ms⾼速化
公開©2021 Yahoo Japan Corporation All rights reserved.SpeedIndexが46%向上393. 結果とビジネスインパクト基準 刷新前 刷新後 結果SpeedIndex 約2302 約1207 約46%改善
公開©2021 Yahoo Japan Corporation All rights reserved.CoreWebVitalsのスコア向上403. 結果とビジネスインパクト
公開©2021 Yahoo Japan Corporation All rights reserved.CoreWebVitalsのスコア向上413. 結果とビジネスインパクト基準 刷新前 刷新後Largest Contentful Paint 3.1s 1.0sTime to Interactive 1.1s 1.3sTotal Blocking Time 60ms 80msCumulative Layout Shift 0 0各スコアは以下のような結果に。(測定環境からの計測値であり、あくまで参考値です。)
公開©2021 Yahoo Japan Corporation All rights reserved.広告指標の改善結果42今回、新たにビジネス影響を算出しました。改善前後で広告のクリック率/閲覧率を⽐較しモバイルwebでは⼤きく数値が向上。•期間は、刷新前(2020年7⽉1⽇から30⽇間)と、刷新後(2020年11⽉16⽇から30⽇間)•レイアウト変更が影響しない1本⽬の広告のみ•対象デバイス(モバイルWeb/アプリWebView)の合算3. 結果とビジネスインパクト基準 刷新前 刷新後 上昇率閲覧率(ViewRate) 36.84% 54.4%147%クリック率(CTR) 0.57% 0.61%108%
公開©2021 Yahoo Japan Corporation All rights reserved.広告指標の改善結果43この結果はGoogle I/Oでも紹介されました。h"ps://www.youtube.com/watch?v=nPmAE0YjGK03. 結果とビジネスインパクト
公開©2021 Yahoo Japan Corporation All rights reserved.SearchConsole (Chrome UX Report)のスコア443. 結果とビジネスインパクト不良として扱われるページはPC環境ではほぼ撲滅...
公開©2021 Yahoo Japan Corporation All rights reserved.SearchConsole (Chrome UX Report)のスコア453. 結果とビジネスインパクトのはずが、最近はまた増加傾向に転じている。😔これは、視聴ページのCLSの計算⽅法が変化したため。継続的な改善が必要です。
©2021 Yahoo Japan Corporation All rights reserved.公開4. 考察と今後のアクション46
公開©2021 Yahoo Japan Corporation All rights reserved.考察1: 継続的な取り組みにする必要がある474. 考察と今後のアクション数値は⽇々変化する。ツールの特徴を活⽤し、変化にすぐ気付ける体制をつくること。ツール 対象 ⽤途lighthouse-ci LAB 定点観測し、試験環境を含む描画の詳細なCWVスコアを確認する。CI/CD(Github Actions等) LABPullRequest毎にファイルサイズや試験環境のCWVの算出して開発をアシスト。サイト分析ツール(Gogole Analytics等) FIELD ユーザーの実測値をログ送信し、詳細に可視化できる。Chrome UX Report FIELD Chromeの匿名情報のBigDataから実測値を取得できる。Search Console FIELD ユーザーの実測値を⽇々URL単位で確認できる。ツール別の特性を活⽤。ヤフーでも定常的な計測環境をサービスごとに⽤意。
公開©2021 Yahoo Japan Corporation All rights reserved.考察2: 共通項⽬はどんどん取り⼊れる484. 考察と今後のアクション実はどのサイトでも共通して改善できる項⽬が多い。ツールの指摘内容の改善、ベストプラクティスを取り込んだライブラリを活⽤することでも、改善できる。今回のノウハウが、⾃分のサービスにも使えないかぜひ確認してみてください。ノウハウ画像の読み込み改善ノウハウCLSの改善ノウハウpreloadヤフー全体でも改善の取り組みを共通ナレッジに。
公開©2021 Yahoo Japan Corporation All rights reserved.⾼速なWEBに向けて、全社の取り組みに展開494. 考察と今後のアクション現在、ヤフー全社でも「快適な操作性」の提供を⽬指してノウハウの展開を進めています。対競合で「快適な操作性」を提供し、ビジネス指標の向上につなげる。待ち時間なくすぐに⽬的を達成できる快適な操作性をヤフーのWEB技術スタンダードにするとともに、SEOを含むビジネス指標の改善を図ります。(c) アフロ
©2021 Yahoo Japan Corporation All rights reserved.公開