Mail.ru のホームページで Core Web Vitals を改善した結果、コンバージョン率が平均 10% 向上

Mail.ru のホームページの Core Web Vitals を改善するために数か月かけて取り組んだ結果、累積レイアウト シフト(CLS)の 75 パーセンタイル値が 60% 向上し、平均セッション時間が 2.7% 増加、コア セクションのコンバージョン率が 10% 以上増加しました。

Denis Stasyev
Denis Stasyev
Sven May
Sven May

最初

Mail.ru はロシア語圏のインターネットで有数のメールサービスであり、トラフィック数でロシア国内のトップ 5 サイトにランクインしています。Mail.ru は多くの人にとって重要なリソースです。毎月数億件のアクセスがあり、メール、ニュース、ソーシャル メディア、パフォーマンス重視のインターネット検索など、さまざまなサービスにアクセスできるポータルです。

Mail.ru は、訪問者に質の高いユーザー エクスペリエンスを提供したいとの思いから、ウェブに関する主な指標の改善に取り組みました。最適化戦略について説明する前に、Mail.ru のホームページの技術的な詳細について説明します。

このプロジェクトは長い間、Google 独自のテンプレート エンジン Fest を使用して開発されていましたが、2019 年に Svelte 3 への移行を開始しました。

Svelte は、仮想 DOM を使用しない方法でリアクティビティを実装しているため、リソース使用量が少なくなります。Svelte のアプローチでは、使用されていない関数を製品バンドルから削除します。関数が使用されていない場合、その実装コードはコンパイラによって生成されないためです。未使用のコードはコンパイル時に削除されるため、バンドルが小さくなります。これにより、ページ起動時の合計ブロック時間(TBT)を短縮できます。

パフォーマンス指標の追跡

ウェブに関する主な指標を最適化する前に、現場でパフォーマンスを評価することをおすすめします。Core Web Vitals の導入前は、内部のパフォーマンス ダッシュボードで First Contentful Paint(FCP)などの他の指標をトラッキングしていました。

指標収集スクリプトが変更され、Core Web Vitals を収集してパフォーマンス ダッシュボードに送信し、可視化できるようになりました。Google の推奨事項に沿って、このスクリプトは PerformanceObserver API を使用して指標を取得します。これは、Mail.ru 内のユニバーサル フロントエンド「Platform」の一部です。

ダッシュボードには、ユーザーに関する次の指標(2021 年 3 月 15 ~ 21 日の週の平均値)が表示されます。

指標グループ名 Core Web Vitals その他のウェブに関する指標
指標名 LCP FID CLS FCP TBT TTI
Core Web Vitals のしきい値に応じたユーザーの割合 good 52% 92% 33% 35% 42% 43%
改善が必要 19% 5% 23% 38% 16% 25%
悪い 29% 3% 44% 27% 42% 32%
2021 年 3 月 15 ~ 21 日の週の指標
最適化前の Core Web Vitals では、約 3 分の 1 のユーザーが「低」バケットに分類されています。
改善前ウェブに関する主な指標の値。

Core Web Vitals の改善

Core Web Vitals の改善に関するガイダンスは豊富にありますが、プロジェクトごとに固有の課題があります。Mail.ru のホームページでは、次の改善案が見つかりました。

CLS 改善のためのスケルトン

CLS は、Mail.ru のホームページで最もパフォーマンスの低いフィールド指標の一つでした。Chrome デベロッパー ツールの [パフォーマンス] パネルでこのページをプロファイリングした結果、広告が問題の原因であることが判明しました。レイアウトの安定性を高めるために、広告が読み込まれる前にプレースホルダを使用して広告のスペースを予約することにしました。

プレースホルダを実装する際の最初のステップは、プレースホルダに代わるコンテンツのサイズを決定することです。幸い、Mail.ru のパソコン版ホームページには、広告のサイズが厳密に記載されています。デザインチームと話し合った結果、コンテンツの読み込み時間の短縮を目的として、SVG アニメーションの UI スケルトンをプレースホルダとして使用しました。

SSR の復活

Fest から Svelte への移行を容易にするため、最初から書き直すのではなく、既存のプロジェクトを段階的に書き換えました。2021 年 3 月までに、フロントエンドのほとんどを Svelte に移行し、バックエンドのパフォーマンスの問題を優先して修正した後、最終的に本番環境のアプリケーションに SSR を導入しました。

SSR を実装した後、チームは当初気付かなかった CLS の低下原因を発見しました。ページ上の最初のコンテンツをレンダリングする時点でニュース セクションが挿入されていませんでした。サーバーから提供されたページ マークアップの最初のペイントと、クライアントでのニュース セクションの挿入の間に遅延が発生しました。この動作により、広告スケルトンがずれ、CLS が悪化しました。

Chrome の DevTools には Layout Shift イベントが表示されましたが、当初は原因を特定できませんでした。SSR 自体は問題ではありませんでしたが、後で解決策を見つけるのに役立ちました。ペイントの遅延の原因となるコードを修正し、ニュース コンポーネントのレイアウトの安定性を改善しました。

JavaScript が有効になっていると、ニュース セクションに空のページが表示され、レイアウト ジャンプが非表示になります。
JavaScript が無効な状態でニュースのペイントに関する問題を特定。
JavaScript を無効にすると、これまでは人間の目には見えなかったレイアウトのずれが明らかになりました。
JavaScript が無効な状態でニュースのペイントに関する問題を修正。

SSR が CLS に与えるもう 1 つの影響は、水和前後のコンポーネントの移動です。これにより、レイアウトのずれがさらに発生する可能性があります。この問題は特にモバイル バージョンで発生し、ハイドレートされたコンポーネント マークアップに特に注意を払う必要がありました。この問題の解決策として、可能な限り表示ロジックを JavaScript から CSS に移行しました。

コード分割と未使用のポリフィル

ページの読み込み速度を改善するために、LCP と FID の値を下げる作業が必要でした。これを実現する 1 つの方法は、コード分割です。Mail.ru のホームページ自体に加えて、ポータル ナビゲーション用のウィジェットも開発中です。現在、Google の多くのプロジェクトに組み込まれています。

歴史的な理由により、ウィジェットは同期読み込みスクリプトとしてページの一番先頭に挿入されます。このスクリプト内のポリフィルの割合は、時間とともに増加しました。これらのポリフィルの読み込みによるパフォーマンスへの悪影響を抑えるために、最新のブラウザと従来のブラウザの両方でコード分割を実装しました。

<script> 要素の type="module" 属性は、Google のニーズに十分な最新のブラウザをターゲットにしていないため、最新のブラウザまたは以前のブラウザの JavaScript バンドルを読み込むために module/nomodule パターンを使用しないことにしました。この問題に対処するため、Mail.ru はバックエンドで最新のブラウザ バージョンを特定するための社内ツールを使用して、それらのブラウザに適切に対応しています。

バックエンドでブラウザを識別できるようになったため、最新のブラウザと従来のブラウザのコード分割を実装しました。その結果、モダン ブラウザ向けの同期読み込み JavaScript ウィジェットのサイズが 43.3% 削減されました。この方法は、他のポータル スクリプトにも適用されています。

コード分割は、バンドルサイズの削減と Core Web Vitals への好影響に加えて、デベロッパー エクスペリエンスの向上にもつながります。レガシー ブラウザを使用しているユーザーは 3.5% に過ぎず、その割合は減少傾向にあるため、コード分割を実装することで、デベロッパーはレガシー ブラウザに必要なポリフィルの肥大化をすべてのユーザーに導入することなく、最新のブラウザ API を使用できるようになりました。

結果

最適化後、2021 年 5 月 24 ~ 30 日の週のフィールドデータの平均値は次のようになりました。

指標グループ名 Core Web Vitals その他のウェブに関する指標
指標名 LCP FID CLS FCP TBT TTI
Core Web Vitals のしきい値に応じたユーザーの割合 good 58%(+6%) 93%(+1%) 93%(+60%) 43%(+8%) 49%(+7%) 51%(+8%)
改善が必要 18% 4% 3% 34% 17% 24%
悪い 24% 3% 4% 23% 34% 25%
2021 年 3 月 24 日~ 30 日の週の指標
良好なバケット内のすべての指標が 1% 以上改善されました。CLS を 60% 改善できます。
改善前後のウェブに関する指標の比較(「良好」グループの変化はかっこで示されています)。

以下のグラフは、ウェブページのパフォーマンス指標の値が「プラットフォーム」に応じてどのように変化したかを示しています。グラフの次の 2 つの重要な日付に注目してください。

  • 2021 年 3 月 23 日: 最後のページのセクションを Svelte に移行したイテレーションをリリースしました。
  • 2021 年 4 月 19 日: CLS の回帰を修正するために、SSR を返すように変更し、レイアウトを変更したイテレーションをリリースしました。

5 月 1 日から 5 月 10 日の値の減少は、ロシアの 5 月の祝日によるものです。

2021 年 3 月から 6 月 1 日までの LCP は、時間の経過とともにわずかに改善しています。
[プラットフォーム] の LCP グラフ: 2021 年 3 月 16 日~ 6 月 1 日
2021 年 3 月 16 日から 6 月 1 日までの FID は、全体的にわずかに改善しています。 [プラットフォーム] の FID グラフ: 2021 年 3 月 16 日~ 6 月 1 日。
2021 年 3 月 16 日から 6 月 1 日までの CLS。4 月 23 日以降に大幅な改善が見られます。
[プラットフォーム] の CLS グラフ: 2021 年 3 月 16 日~ 2021 年 6 月 1 日

[プラットフォーム] を使用して得られた結果は、Chrome UX レポート(CrUX)の指標値の増加と一致しています。

CrUX の LCP 指標で、良好なバケットが 51% から 58% に増加していることを示しています。
2021 年の CrUX の LCP 指標の変更
CrUX の FID 指標。良好なバケットで FID が 91% から 93% にわずかに改善しています。
2021 年の CrUX の FID 指標の変更
CrUX の CLS 指標。良好なバケットで 46% から 98% と大幅に改善されています。
2021 年の CrUX の CLS 指標の変更

最初の改善のロールアウトの 1 週間前とロールアウトの 1 週間後のユーザー セッションの平均時間の値を比較すると、2.7% の増加が見られます。さらに、ページのほとんどのセクションでコンバージョンが大幅に増加しています。特に、Mail.ru メールアプリへのコンバージョンは 11.6%、ニュース セクションのコンバージョンは 13.5% 増加しました。

181%

良好な CLS の割合のしきい値を引き上げ

2.7%

平均セッション継続時間が長い

13.5%

ニュース セクションのコンバージョン率の向上

最も予想外の成果は、マーケティング バナーのクリック率(CTR)が 17.4% 上昇したことです(SSR タグとプリロード タグの導入により、レンダリング時間が大幅に短縮されました)。

ページの残りのセクションを分析した結果、ほとんどのセクションでパフォーマンスが大幅に改善されました。ページで重要ではない「天気」や「COVID-19」などのセクションでも、コンバージョンがそれぞれ 9.6% と 9.5% 増加しています。

まとめ

パフォーマンスの改善は、関連する作業が長引く可能性があるという点で困難です。指標の変化を定期的にモニタリングし、すべての新機能が Core Web Vitals の低下を引き起こさないようにする必要があります。そのために、パフォーマンス バジェットで Core Web Vitals の変化をモニタリングしています。

最も重要なことは、マネージャーやデザイナーからテスターや QA まで、プロダクト チームのすべてのメンバーにウェブに関する主な指標の重要性を強調したことです。各チームメンバーはパフォーマンス指標を把握し、指標を改善する権限を付与されている必要があります。また、パフォーマンスの最適化目標をビジネス プロセスに定期的に組み込んでいます。質の高いユーザー エクスペリエンスを提供するには、チームメンバー全員の共同作業が必要です。