診断とコンサルティング · Prijsvrij

旅行予約フローでCLSを0.4から0.06に改善

レイアウトシフトが発生していたのは予約フローで、その大半は初回ページ読み込みの後に起きていました。

1.8秒LCP(改善前は2.6秒)
0.06CLS(改善前は0.4)
160msINP(改善前は215ms)
クライアントPrijsvrij、Prijsvrij.be、D-reizen(旅行予約)
プラットフォームSPA
サービス2026年3月にサイト診断を実施、以降は四半期ごとにコンサルティング
クライアント

予約フローでレイアウトシフトが発生していたSPA

Prijsvrijは、旅行の検索・比較・予約ができるオランダの旅行サイトです。サイト全体がSPAで構築されており、同じチームがPrijsvrij.beとD-reizenも運営しています。

現地で1日4時間、計2日間の作業を行いました。初日はサイトの診断を実施しました。2日目はチームと診断結果を確認し、最も優先度の高い問題から順にどう修正すべきか、ステップごとに説明しました。

Prijsvrijのホームページ
現状の課題と実施した対策

ファーストビュー、予約フロー、クリック操作

レイアウトシフトの大半は、ソフトナビゲーションで発生していました。ページを再読み込みせずにアプリがコンテンツを切り替える処理です。トップページでLighthouseを実行しても、これらは一切検出されません。しかし、予約を進める実際のユーザーは遭遇します。そしてCrUXは、最初に開いたURLのシフトとしてカウントします。

問題点
実施した対策
LCP
CSSの分割方法がファーストビューの表示を遅らせていました。preloadは初期表示で不要なファイルを指定し、画面外の画像まで読み込まれていました。ヒーロー画像はJavaScriptの実行後しか検出されず、サードパーティタグやフォントも早い段階で読み込まれていました。
ヒーロー画像にpreloadとfetchpriority="high"を設定し、ページごとに読み込みの優先順位を決めました。LCPは2.6秒から1.8秒に改善しました。
CLS
フライト情報を中心とした旅行データの取得中、アプリはローディングアニメーションを表示し、データが届いた瞬間にコンテンツが画面を押し下げていました。ステップ間の遷移でも、画像やバナー、お知らせ表示が同様にレイアウトを崩していました。
ローディング表示にフライト表示枠の最終サイズを持たせ、画像やバナー、お知らせ表示には固定の寸法を設定しました。CLSは0.4から0.06に改善しました。
INP
フィルターをクリックするたびに全検索結果の再計算と再レンダリングが発生し、日付選択ではクリック処理の中で数か月分の料金データを生成していました。人数や部屋の選択時も予約全体が再計算され、同じクリック処理の中でトラッキングも動作していました。
開発者の実際のコードを使い、各クリックで何が実行されているかを示しました。その上で、まず画面を更新し、残りの処理は後から実行する方法を説明しました。INPは215msから160msに改善しました。
Prijsvrijの予約フロー: レイアウトシフトの大半は初回読み込みの後に発生しており、トップページのLighthouse計測では検出されません
診断後

2026年3月末に診断レポートを提出し、4月15日にデン・ボスで、その1週間後にはオンラインで開発チームとレビューを行いました。特に難関だったのがCLSです。この構成としては原因が通常より多くありました。開発チームが3サイトすべてで改修を完了させた結果、5月には全サイトでデスクトップのCLSがグリーン(良好)になりました。

0.100.250.13Mar 2026Apr0.38MayJunJulAugSepOct0.06prijsvrij.nl, CLS on desktop, p75
0.100.12Mar 2026Apr0.20MayJunJulAugSepOct0.05prijsvrij.be, CLS on desktop, p75
0.100.11Mar 2026Apr0.14MayJunJulAugSepOct0.04d-reizen.nl, CLS on desktop, p75
CrUXにおける3サイトの推移(2026年3月〜10月)。1本のバーは1週間を表し、各日までの28日間のp75値を示します。緑は良好、オレンジは要改善、赤は不良です。
その後

6月のある朝、先方のフロントエンドリードからメールが届きました。CoreDashのClaude Code連携を使い、ここ数週間prijsvrij.nlのチューニングを進めていたところ、グラフが好転してきたとのことでした。「D-reizenも追加できないか」という相談です。1時間も経たないうちに、D-reizenとPrijsvrij.beの両方がCoreDashに追加されました。

次はINPです。6月末に現状を確認したとき、過去に何度も目にしてきたパターンだと気づきました。確立された手順に沿って一つひとつ正確に対処すれば、確実に改善できます。これで大部分は解決します。その奥にある課題が見えてくるのはそれからですが、それらは常に小さな問題です。そこで、よりハンズオンな進め方を提案しました。机上の理論より実践を重視し、ピンポイントで小さな改修を加えていくやり方です。7月には先方のオフィスで昼食を交えて作業を行い、現在も四半期ごとの訪問を続けています。

休暇シーズンには、旅行中のユーザーからのアクセスが増加するため、モバイルのLCPが一時的に上昇します。それでも2.5秒を大幅に下回る水準を維持しており、すでに再び低下し始めています。

学んだこと

ローディングアニメーションはレイアウトシフトを先送りしているだけ

アニメーションで待ち時間をカバーできているように見えていました。しかし、フライト詳細の表示に切り替わった瞬間にレイアウトシフトが発生します。

クリック処理内のトラッキングは、すべてのクリックを遅らせる

クリックハンドラー内のタグは、画面が更新される前に実行されます。更新の後に移動させれば、ユーザーには先に結果が表示され、タグも正常に実行されます。

SPAは変化し続ける

リリースを重ねるたびに、前回のチェック時には存在しなかったコンポーネントやタグが追加されます。だからこそ、私は四半期ごとに訪問を続けています。

Arjen Karel

Lighthouseでは検出できないSPAのレイアウトシフトはありませんか?

予約フローや決済フローのURLをお送りください。ソフトナビゲーションを含め、実際のユーザーと同じように画面を操作して確認します。

Prijsvrij: 予約フローでCLSを0.4から0.06に改善 Core Web Vitals Prijsvrij: 予約フローでCLSを0.4から0.06に改善