パフォーマンス改善の実践的な取り組み方を紹介
平野 耀介実践!パフォーマンス改善2021年 07月 28日
View Slide
なぜ僕が話すのか?
担当PJにおける改善成果● Core Web VitalsがPC / SP全て良好に● PSIが15程度から 60〜80に
本会の1番の動機
同じ苦労をしないでほしい😭😭
本日お話すること(≒ゴール)1. (Why)なぜパフォーマンスを改善するべきなのか2. (How)どのように改善すればよいのか3. (How事例)どう改善したのか
なぜ改善するべきか【結論】2つの事業的メリットがあるから1. SEO2. ユーザー体験改善による収益性(≒離脱率, CVR)の向上
2018年7月から読み込み速度がランキング要因に2021年6月からコアウェブバイタルがランキング要因につまり、ページパフォーマンスはSEOに直接的な影響がある※どちらも同点決勝の基準程度の重み→ 当然ながら関連性やコンテンツ品質などのが重み大なぜ改善するべきか1. SEOとの関連性
なぜ改善するべきかGoogleいわく、表示速度: 1秒 → 3秒 直帰率: 32%上昇表示速度: 1秒 → 5秒 直帰率: 90%上昇Pinterest待ち時間を40%削減 → SEOの流入とログイン率が15%向上⤴> 参照: Pinterest - Driving user growth with performance improvements2. 収益性との関連性
なぜ改善するべきかGoogleいわく、表示速度: 1秒 → 3秒 直帰率: 32%上昇表示速度: 1秒 → 5秒 直帰率: 90%上昇Pinterest待ち時間を40%削減 → SEOの流入とログイン率が15%向上⤴> 参照: Pinterest - Driving user growth with performance improvements2. 収益性との関連性CVR ⤴離脱率 ⤵
なぜ改善するべきかパフォーマンス改善をする理由は2つの事業メリットのため1. SEO2. ユーザー体験改善による収益性向上(離脱率⤵, CVR⤴)その他のメリット● リクエスト量の削減● ユーザー体験向上まとめ
どう改善するのか目的を明確にする例)SEOのためにCore Web Vitalsを全て良好にするまずは目的・目標を定義する1計測して現状を把握する2指標ごとの目標を決める例)LCP: 2.5s, FID: 100ms, CLS: 0.13
計測してみよう!💪
見なくていいPSIの読み方
フィールドデータまたはリアルユーザーモニタリング(Real User Monitoring)PSIの読み方
計測の知識実ユーザーの環境で計測する方法● Chrome UX Reports● Search Console● NewRelic BrowserGoogleの呼び方フィールドデータChrome UX ReportSearch Console計測方法① リアルユーザーモニタリング(RUM)
ラボデータまたは合成モニタリング(Synthetic Monitoring)
計測の知識可能な限り環境の一貫性を保ち計測する方法● PageSpeed Insights● Webpagetest● Lighthouse (※1)Googleの呼び方ラボデータ計測方法① 合成モニタリング (Synthetic Monitoring)(※1) ある程度収束するものの実行端末のスペックに影響される
どっちを見るのが良いのか?🤔
計測の知識【結論】:両方見る(ケースで使い分ける)リアルユーザーモニタリング(フィールドデータ)● Core Web Vitals改善の成果を見るとき● 実ユーザーの体験を観測するとき合成モニタリング(ラボデータ)● 条件を変えて計測するとき● 改善施策の検証をするとき
その理由めちゃくちゃ上下幅がある→ どの指標で変化したのかわからない正しい目標設定指標ごとに設定する指標ごとの目標目標をPSIスコアで置くことはオススメしない😡
指標ごとの目標Core Web Vitalsで置く場合
指標ごとの目標Core Web Vitalsで置く場合ところでLCPってなに...?🤔
指標ごとの目標指標の説明LCPLargest Contentful Paint最大の画像 or テキストが表示されるまでの時間
指標ごとの目標指標の説明ユーザーの操作から処理を開始できるまでの時間FIDFirst Input Delay
指標ごとの目標指標の説明CLSCumulative Layout Shift予期しないレイアウト移動量の合計
指標ごとの目標FCPFirst Contentful Paintコンテンツの一部が画面に表示されるまでの時間指標の説明
指標ごとの目標指標の説明TBTTotal Blocking Timeメインスレッドがブロックされた時間の合計
どう改善するのか改善サイクルを回す1. 改善したい指標を決める2. 改善の仮説を立てる3. 仮説を検証する4. 実装して再検証、リリース5. 計測・記録する
どう改善するのか改善サイクルを回す1. 改善したい指標を決める2. 改善の仮説を立てる3. 仮説を検証する4. 実装して再検証、リリース5. 計測・記録するLCP画像サイズが大きすぎる画像のリクエストをブロックwebp化 / srcset属性を使うPSIなど (自動化を推薦)
実演✊
どう改善するのか改善サイクルを回す1. 改善したい指標を決める2. 改善の仮説を立てる3. 仮説を検証する4. 実装して再検証、リリース5. 計測・記録するLCP画像サイズが大きすぎる画像のリクエストをブロックwebp化 / srcset属性を使うPSIなど (自動化を推薦)どうやって決めた?🤔
【方法①】 PSIの「診断」を見る【方法②】web.devの指標別改善方法ページを見る前提として...どちらも具体的にはわからない事が多い→ 指標計測のタイミングやシステムの状態を見て考えよう!どう改善するのか実施する施策の選び方
【方法①】 PSIの「診断」を見る気をつけることある程度正確なものの過信は禁物→ 言われたとおりにしても全然指標が改善しないことがあるなので仮説検証をしっかりやること!どう改善するのか実施する施策の選び方 ①
【方法②】web.devの指標別改善方法ページを見る決め方例1. LCPを改善したい2. https://web.dev/optimize-lcp/ を見る3. 「リソースのローディング」が影響してそう(仮説)Google監修だから 正確&自動翻訳で読みやすいため最高の情報源どう改善するのか実施する施策の選び方
どう改善するのかまとめ1. 目的を明確にする2. 計測して現状を把握する3. 指標ごとの目標を決める1. 改善したい指標を決定2. 改善の仮説を立てる3. 仮説を検証する4. 実装して再検証5. 計測・記録する① 目的・目標を決める ② 改善サイクルを回す
10個以上やってきた施策の中で効果的かつ汎用的なものを紹介1. CLSの改善2. ファーストパーティJSの最適化3. 要素の非同期読み込みどう改善したのか改善施策3選※ そのまま横展開は❌ 実装先でちゃんと検証⭕
やることは単純!1. Lighthouseでレイアウトシフトしている要素を調べる2. 修正する(widthとheightを設定する)ただし、そのままだとレスポンシブしなくなる> CSSで「max-width:100%」「height:auto」を設定> これによりaspect-ratioが設定されるどう改善したのか① CLS改善
修正箇所の見つけ方実演💪https://s.kakaku.com/mobile_data/sim/
どう改善したのかやったことは3つ1. 未使用JSの削除2. scriptタグのレンダリングブロック防止3. ページや要素に合わせた動的読み込み(Code Splitting)② ファーストパーティJSの最適化改善する指標FCP / LCP / TBT / TTI
1. 未使用JSの削除どう改善したのか② ファーストパーティJSの最適化Chromeの「Coverage」で未使用処理を発見できる!が、結局は地道な検証が必要(テストコードがあればやりやすい)
Chrome - Coverageの見方処理を通ったかで色が変わるファイルごとのカバレッジJSだけでなくCSSも見れます
● scriptの属性 Defer or Async を使う● 並行で読み込まれ、後で実行される使い分け方● DOMの読み込みを待ちたい → Defer● 読み込み後すぐ実行OK(DOMに依存しない) → Asyncどう改善したのか② ファーストパーティJSの最適化2. scriptタグのレンダリングブロック防止
どう改善したのか② ファーストパーティJSの最適化2. ページや要素に合わせた動的読み込み(Code Splitting)要素の有無でJSを動的に読み込ませるために、● 特定要素(タブコンポーネントなど)専用のJSを分割● 要素があるかチェック、存在するときにDynamic Importimport関数を使えば Webpack SplitChunksPlugin がいい感じにやってくれる※ webpack ≧ 4に限る
どう改善したのか② ファーストパーティJSの最適化2. ページや要素に合わせた動的読み込み(Code Splitting)この実装で、● toggleAccordionが別ファイルに分割● 「.js-accordion」が存在するときのみ読み込まれるJS本体のコードが減り、 FCPやTBTが改善
どう改善したのか③ 要素の非同期読み込み影響の大きいスクリプトを非同期で読み込ませる改善する指標FCP / LCP / TBT / TTI例)TwitterウィジェットのJSなど
ご清聴ありがとうございました!