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

Mail.ru のホームページで Core Web Vitals を改善するための数か月間の取り組みにより、Cumulative Layout Shift(CLS)の 75 パーセンタイルが 60% 増加し、平均セッション時間が 2.7%、コアセクションのコンバージョン率が 10% 以上増加しました。

Denis Stasyev
Denis Stasyev
Sven May
Sven May

最初

Mail.ru はロシア語圏のインターネット大手のメール サービスの一つで、トラフィックでロシアの上位 5 つのサイトに入っています。Mail.ru は多くの人にとって重要なリソースです。1 か月に数億件のアクセスがあり、そこからメール、ニュース、ソーシャル メディア、パフォーマンス インターネット検索などにアクセスできます。

Mail.ru は訪問者に高品質のユーザー エクスペリエンスを提供したいと考え、Core Web Vitals を改善する取り組みを始めました。最適化戦略について説明する前に、まず Mail.ru ホームページの技術的な詳細をいくつか確認しておきます。

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

Svelte は、Virtual DOM を使用しない方法でリアクティビティを実装しているため、リソース消費量が少なくなります。Svelte のアプローチでは、未使用の関数を製品版バンドルから削除します。これは、関数が使用されなければ、それらを実装するコードがコンパイラによって生成されないためです。コンパイル時に未使用のコードが削除されるため、バンドルのサイズが小さくなります。これにより、ページ起動時のTotal Blocking Time(TBT)を短縮できる可能性があります。

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

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

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

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

指標グループ名 Core Web Vitals その他のウェブに関する指標
指標名 LCP FID CLS FCP 未定 おすすめスポット
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 日の週の指標
最適化前のウェブに関する主な指標では、ユーザーの約 3 分の 1 が「良好」に分類されています。
改善前のウェブに関する指標の値。

Core Web Vitals の改善

Core Web Vitals を改善するためのガイダンスは豊富にありますが、プロジェクトごとに固有の課題があります。Mail.ru ホームページには、次のような改善の機会があります。

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

CLS は、Mail.ru ホームページのフィールド指標の中で最もパフォーマンスが低いものの 1 つでした。その後、Chrome の DevTools の [パフォーマンス] パネルでこのページをプロファイリングしたところ、広告が問題の原因となっていることがわかりました。そこで Google では、レイアウトの安定性を高めるために、広告が読み込まれる前に広告用のスペースを確保できるようプレースホルダを使用することにしました。

プレースホルダを実装する場合、最初のステップは、プレースホルダを置き換えるコンテンツのサイズを決定することです。幸いなことに、Mail.ru の PC 版ホームページには広告のサイズが厳密に記載されています。設計チームとの話し合いの結果、SVG アニメーションの UI スケルトンがプレースホルダとして使用されました。コンテンツの読み込みに要する時間が短くなるためです。

SSR のリターン

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

SSR の実装後、チームは当初気づかなかった CLS 回帰の原因を発見しました。これは、ページの最初のコンテンツをレンダリングする時点で、ニュース セクションが挿入されていなかったことです。サーバーから提供されたページ マークアップの最初の描画から、クライアントのニュース セクションの挿入までに遅延が生じました。その結果、広告のスケルトンが変化し、CLS が悪化しました。

Chrome の DevTools には Layout Shift イベントが表示されていましたが、最初はその理由がわかりませんでした。SSR 自体は問題ではありませんでしたが、後で解決策を見つけるのに役立ちました。ペイントの遅延の原因となっているコードを修正することで、ニュース コンポーネントのレイアウトの安定性が向上しました。

アクティブな JavaScript では、ニュース セクションに空のページが表示されるため、レイアウト ジャンプが隠されます。
JavaScript を無効にしてニュース ペイントの問題を見つける。
JavaScript を無効にすると、これまで人間の目には見えなかったレイアウト シフトが明らかになりました。
JavaScript を無効にした場合のニュース ペイントの問題を修正

SSR が CLS にもたらすもう一つの影響は、ハイドレーションの前後のコンポーネントの動きです。これは、さらなるレイアウト シフトにつながる可能性があります。これは特にモバイル版で発生しており、ハイドレートされたコンポーネントのマークアップには特に注意を払う必要がありました。この問題の解決策として、できる限り多くの表示ロジックを JavaScript から CSS へ転送する方法がありました。

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

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

歴史上の理由から、ウィジェットは同期読み込みスクリプトとしてページの先頭に挿入されています。このスクリプトにおけるポリフィルの割合は、時間の経過とともに増加しています。このようなポリフィルの読み込みによるパフォーマンスの低下を抑えるために、最新のブラウザと従来のブラウザの両方にコード分割を実装しました。

最新または従来のブラウザで JavaScript バンドルを読み込む場合、module/nomodule パターンは使用しないことにしました。これは、<script> 要素の type="module" 属性が、当社のニーズに十分対応できる最新のブラウザをターゲットとしていなかったためです。これに対処するために、Mail.ru はバックエンドで最新のブラウザ バージョンを識別する社内ツールを使用しており、それに応じて各ブラウザに適応しています。

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

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

結果

最適化の取り組みの後、フィールド データで 2021 年 5 月 24 日~ 30 日の週の平均値が観察されました。

指標グループ名 Core Web Vitals その他のウェブに関する指標
指標名 LCP FID CLS FCP 未定 おすすめスポット
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% 以上向上しました。60%向上しました
前後におけるウェブに関する指標の比較(「良好」グループの変化は角括弧内に示しています)。

以下のグラフは、ウェブページのパフォーマンス指標の値の推移を「プラットフォーム」別に示しています。グラフ上の 2 つの重要な日付に注意してください。

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

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 日から 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 とプリロード タグの導入により、表示時間が大幅に短縮されました)。

ページの他のセクションを分析したところ、その大部分で大幅なパフォーマンスの向上が確認されました。「天気」や「新型コロナウイルス」などのページは重要ではありませんが、コンバージョン率はそれぞれ 9.6% と 9.5% 増加しています。

おわりに

関連する作業に時間がかかるという点で、パフォーマンスの改善は困難です。指標の経時的な変化を定期的にモニタリングし、プロダクトのすべての新機能によって Core Web Vitals の回帰が発生しないようにする必要があります。これを実現するために、Google ではパフォーマンス バジェットで Core Web Vitals の変化をモニタリングしています。

最も重要な点として、マネージャーやデザイナーからテスターや QA まで、プロダクト チームのすべてのメンバーに対して Core Web Vitals の重要性を強調しました。各チームメンバーはパフォーマンス指標を認識し、指標を改善できるようにする必要があります。また、定期的にビジネス プロセスにパフォーマンスの最適化目標を組み込んでいます。質の高いユーザー エクスペリエンスの提供は、チームメンバー全員の共同作業によってのみ可能になります。