クライアントサイドルーティングフレームワークの監視:SPA、CSR、ハイブリッド

クライアントサイドルーティングフレームワークの監視:SPA、CSR、ハイブリッドモダンなウェブアプリケーションは重心を移しました。もはやページがシステムではなく—ランタイムがシステムです。React、Angular、Vue、Next.js、SvelteKit、Remix、Nuxt といったフレームワークは HTML をブートローダーとして扱い、実際のアプリケーションは hydration、ルーティング、データ取得、継続的な再レンダリングの後に初めて現れます。ユーザーが体験するものは静的なマークアップではなく、完全に JavaScript の実行に依存します。

UI は読み込まれているように見えても何も動かない、という状況でチームはこの変化に気づくことが多いです。ボタンが反応しない、パネルが空のまま、フローがサーバー側の明白なエラー無しに壊れる。アプリケーションが実際に使えるかどうかを決めるのはページではなくルーターですが、ほとんどの監視ツールはそれを観測していません。

SPA、CSR、SSR、あるいはハイブリッドアーキテクチャでページ中心の監視に頼っているなら、あなたはアプリケーションではなくシェルを見ていることになります。本稿ではルーティング駆動のシステムを適切に監視する方法、そして合成フローや RUM が初期 HTML ではなくランタイムに従うべき理由を説明します。

ページ読み込み後の監視

マルチページアプリでは、ページのライフサイクルがアプリケーションのライフサイクルでした。読み込み時間、DOM の準備状態、エラー、サーバー応答を計測していました。依存関係は安定して可視でした。

クライアントサイドルーティングはその前提を壊します。最初の読み込みは多くの読み込みのうちの一つにすぎません。実際の障害は、ブラウザがリセットしない状態で発生します:動的なコンポーネントツリー、蓄積されたストアデータ、fetch キャッシュ、ルートガード、フィーチャーフラグ、URL リロードなしに一つの論理的な「ページ」から別の「ページ」へ移る遷移などです。監視が DOMContentLoaded で止まっていると、ランタイムの 90% を見逃します。

運用上の問いはこうなります:ユーザーが画面を切り替えても「再起動しない」アプリケーションをどう測るか?

答えは:ルーターに従うことです。

なぜクライアントサイドルーティングは従来の監視モデルを壊すのか

ルーティングフレームワークはナビゲーションイベントを傍受し、その場で新しいビューをレンダリングし、リモートサービスへ非同期呼び出しを行います。URL が変わることもあれば変わらないこともあります。DOM が部分的に更新されることもあれば完全に再レンダリングされることもあります。「ページ完了」の概念はありません。「ビューがマウントされた」「データが解決された」「ストアが更新された」という状態だけです。

従来の稼働確認は次を前提とします:

  • 新しいページの読み込みがあること。
  • 決定的な HTML 応答があること。
  • 操作前に完全な DOM があること。

これらの前提は SPA/CSR アーキテクチャでは成立しません。ルート遷移は URL が有効に見えても失敗することがあります。コンポーネントはマウントされてもそのデータ層が壊れていることがあります。フィーチャーフラグサービスがペルソナごとに異なるペイロードを返し、合成モニタはそれを「一時的」として無視してはなりません。監視はドキュメントベースではなく振る舞いベースになります。URL をチェックするだけではなく、体験を検証しなければなりません。

アーキテクチャのスペクトラム:SPA、CSR、SSR、SSG、ハイブリッド

ウェブ開発はレンダリングモデルのスペクトラムに分かれています:

  • 純粋な SPA/CSR は単一の HTML ページを読み込み、全てを JavaScript に任せます。ナビゲーションは完全にクライアント駆動です。UserView 型の監視はページではなく実行を理解する必要があります。
  • SSR フレームワーク(Next.js、Nuxt、SvelteKit)は初回のサーバー側レンダリングを提供しますが、以降のナビゲーションにはクライアントサイドルーティングを使います。結果として初回の描画は MPA のように振る舞い、その後のインタラクションは SPA のように振る舞います。
  • SSG と ISR は事前に静的な HTML を生成しますが、hydration によってアプリケーションが動作するかが決まります。静的ページは正しく見えても、水和されたコンポーネントが静かに失敗することがあります。
  • ハイブリッドモデル はルートや環境ごとにモードを混在させます。ログアウト状態のユーザーは SSR を受け取り、ログインユーザーは CSR を受け取るかもしれません。

アーキテクチャが影響を与えるのは最初のレンダリングだけです。監視はその後のランタイムに注力しなければなりません。

SPA/CSR アプリにおける実際の障害モード

ルーティング駆動のアプリケーションは、従来のモニタが決して見ない新たな障害カテゴリを導入します。

hydration エラーはよくあります:HTML のシェルはレンダリングされるが、JavaScript がサーバー側レンダリングのマークアップとクライアント側レンダリングのマークアップの不一致に遭遇する。アプリは生きているように見えるが凍結している。

ルーター初期化の失敗は、ルート定義の衝突、lazy モジュールの読み込み失敗、あるいはルーターが現在の状態を解決できない場合に発生します。ユーザーは動作する枠組みだけを見て、コンテンツがない状態になります。

ストアの破損は、Redux、Vuex、NgRx、Zustand などがナビゲーションを跨いで不正な状態を保持する時に発生します。SPA は状態をリセットせずに蓄積するため、障害はマルチステップフローの深部で現れます—まさに多くのモニタが測定を止める場所です。

サイレントな API 障害は、ルーターが正常に遷移してもデータ層が 500 や 403 を返すと発生します。ビューは読み込まれるが、ウィジェットは不完全または空で表示されます。監視はこれを障害として認識しなければなりません。そうでなければダッシュボードは緑のまま、ユーザーは半分しかレンダリングされていない画面に取り残されます。

古いバンドルは常に脅威です。CDN が古い JS を配信するとバージョン不整合が発生し、hydration やルーティングがクラッシュします。これらの障害は地域ごとに異なって現れるため、合成監視はそれを検出するのに適しています。

これらの障害モードはすべてページ読み込み後に発生します。ほとんどはユーザー操作の連続の後にしか現れません。監視モデルにマルチステップの合成フローが含まれていないと、ユーザーの苦情が出るまで見つかりません。

ルーティング負荷の高いフレームワークでのナビゲーション計測

SPA におけるナビゲーション成功は DOM が落ち着くのを待つだけでは判断できません。ランタイムは決して落ち着きません。

代わりに監視は以下を測定する必要があります:

  • ユーザー操作(クリック/タップ)からルーティングされたビューまでの時間。
  • ドキュメントの準備ではなく、コンポーネントのマウント完了。
  • データ解決—必要な XHR/fetch コールは完了し、UI がそれらを消費したか?
  • UI の確認—ページは実際に期待されるインタラクティブな状態をレンダリングしたか?

「ロード時間」指標は意味をなさなくなります。重要なのはトランジション遅延、hydration の完全性、データ依存性の整合性です。

モニタはドキュメントのライフサイクルではなく、ユーザージャーニーのタイムラインを観察しなければなりません。

マルチステップのルーティングフローに対する合成監視

ルーティング駆動のアプリケーションを監視するには、軽量な HTTP チェックではなく完全なブラウザ実行が必要です。ルート遷移はページ読み込みのようには振る舞わず、多くのスクリプト化されたブラウザテストは予測可能な URL 変化や静的 DOM 状態を前提にしているため失敗します。合成フローは実際のユーザーのように振る舞う必要があります:クリックし、ナビゲートし、ルーターを発火させるようにインタラクトする。URL が同じままでもルーターイベントを認識し、コンポーネント更新に応じて変化する DOM を追跡し、各遷移が引き起こす非同期作業を追わなければなりません。

最も重要なのは、テストが UI が実際に期待された状態に達したことを確認することです。つまり、データ層の解決を監視し、それに依存するマウント済みコンポーネントを待ち、ドキュメントロードのタイムを測るのではなくレンダリングされたインターフェースを検証することを意味します。これがルーティングされたビューが完全かつ機能的であるかを確実に知る唯一の信頼できる方法です。

障害はしばしばステップ間に隠れています。SPA は何度か正常にナビゲートしても、状態の蓄積、メモリ圧迫、ルートガードのエッジケースが最終的にフローを破壊することがあります。これらはユーザーが遭遇する問題であり、単純なモニタは決して見ません。だからこそ現代のフロントエンド向け合成監視は孤立した操作ではなく現実的なシーケンスをモデル化する必要があり、ルーティング認識型テストは利便性ではなく必須インフラになっています。

ルーター背後の API レイヤーの監視

SPA はバックエンドをマイクロサービスの集合として扱います。ナビゲーションは次のような API 呼び出しを引き起こします:

  • GraphQL エンドポイント
  • REST サービス
  • 検索・レコメンデーションエンジン
  • フィーチャーフラグサービス
  • パーソナライゼーションエンドポイント
  • 認証・認可レイヤー

ルーターは成功しても、基盤となる API が失敗することがあります。ユーザーの視点では、シェルが読み込まれてもアプリは壊れています。

監視はルートの成功とサービスの成功を相関させる必要があります。UI がコンポーネントを読み込んでも、API が遅いまたは誤った応答を返してそれを埋められない場合、合成フローはそれを失敗として扱わなければなりません。そうでなければ監視は緑のダッシュボードを表示し、ユーザーは半分しかレンダリングされていない画面で立ち往生します。

キャッシュ、CDN、バンドルの観点

ルーティング駆動のアプリケーションは従来のサーバーレンダリングサイトよりも CDN やアセットパイプラインに依存しており、体験全体の安定性はバンドルの整合性に依存します。キャッシュルールの誤設定、ETag やバージョンハッシュのずれ、あるいは CDN の特定リージョンが古いチャンクを配信すると、サーバーが 200-OK を返し続けていてもルーターが壊れることがあります。これらの障害は理論上の話ではなく、HTML と JavaScript 間の hydration 不一致、正しいシェルを読み込むが誤ったバンドルを実行するページ、対応するチャンクが現在のビルドと一致しないために失敗する lazy ロードモジュールとして現れます。

これらの問題は世界的に一様に現れることは稀です。あるリージョンは新しいアセットを受け取り、別のリージョンは数分や数時間遅れることがあり、一部のユーザーにのみ不整合な挙動が発生します。そして SPA が「ウォーム」なランタイムに依存するため、多くのこうした障害はきれいな初回読み込み時ではなく一連のナビゲーション後に現れます。

監視はこれらの不整合を可視化できなければなりません。単一リージョンのテストや常にコールドスタートで始める合成チェックは、CDN 関連のルーティング障害の大半を見逃します。状態を持つマルチリージョンの合成フローだけが信頼できるガードレールを提供し、ユーザーが実際に見るバンドルとキャッシュの挙動を露呈します—監視ツールが簡略化して想定しがちなバージョンではなく。

SSR とハイブリッドフレームワークを正しく監視する

SSR は一般的な盲点を生みます:サーバー側でレンダリングされた HTML が正しく見えるため、チームは監視が完了していると仮定しがちです。しかし SSR はフレームワークの半分にすぎません。hydration が成功しなければ、ユーザーインタラクションは利用できません。hydration が失敗すれば、ページはインタラクティブでない絵葉書に過ぎません。

監視は次を分離して扱う必要があります:

  • SSR のパフォーマンスと可用性
  • hydration の完全性
  • CSR ナビゲーションのパフォーマンス
  • ウォームナビゲーションの安定性

ハイブリッドフレームワークはさらに複雑化します。単一のルートが認証状態、ジオロケーション、A/B テストの割り当て、フィーチャーフラグのバリエーションによって異なる振る舞いをすることがあります。

これは合成監視が複数のペルソナを評価する必要があることを意味します。単一のログインフローでは不十分です。単一のルートパスでも不十分です。ハイブリッドモデルは足元で振る舞いを変えるため、監視はユーザーが取りうるすべてのパスを辿る必要があります。

SPA に対して実際に有効な合成監視戦略

効果的な監視は、振る舞いベースでランタイム駆動のモデルを採用します。

サーバーが何を返したかを測るのではなく、ルーターを駆動するユーザー操作をシミュレートします。DOM の準備を待つのではなく、目に見える結果を待ちます。API 呼び出しを手動で確認するのではなく自動で観察します。ウィジェットの内容欠如を受け入れ可能な部分成功として扱うのではなく故障と見なします。

コンソールログをキャプチャするモニタは hydration エラー、ルーターのクラッシュ、動的インポートの失敗を明らかにします。XHR/fetch を追跡するツールは、成功したナビゲーションの背後に隠れたデータの失敗を露呈します。レンダリングされた UI に対するアサーションは、アプリがサーバーの応答通りに振る舞うのではなく、ユーザーが期待するように振る舞っていることを保証します。

監視はページの正しさのレンズではなく、ランタイムの正しさのレンズになります。

RUM + 合成:ルーティングフレームワークのための統合可視性モデル

RUM(Real User Monitoring)は実際のフィールドデータを提供します。地域的な劣化、デバイス間の差異、ロングテールの遅延、ユーザー行動パターンを浮き彫りにします。

合成監視は決定論的なワークフロー、一貫した回帰検出、管理された条件を提供します。

ルーティング駆動のアプリケーションには両方が必要です。

RUM だけでは将来の回帰を検出できません。合成だけでは実世界の変動性を捉えられません。両者を組み合わせることで、SPA とハイブリッドのための完全な監視サーフェスが形成されます:

  • 合成は早期に障害を発見する。
  • RUM はその影響を確認する。
  • 合成は問題を再現する。
  • RUM は修正を検証する。

この好循環は、動的に振る舞いを変える複雑なフロントエンドにとって不可欠です。

バージョンドリフト、リリース速度、合成監視の役割

モダンなフロントエンドのビルドパイプラインは常に新しいバージョンを生み出し、デプロイシステムはそれらを不均一に配布することがよくあります。CDN のエッジが古いアセットのパージに数分を要することもあり、ISR ページは異なる間隔で再生成され、ロールアウトは新しいバンドルをユーザーのごく一部にのみ公開することがあります。この環境では「同じページ」を読み込んだ 2 人が、実際には互換性のないビルドを実行している可能性があります。

合成監視はこの状況で安定化要因になります。HTML と JavaScript が一致しなくなったとき、エッジが古いバンドルを配信しているとき、フィーチャーフラグが予期せぬ組み合わせで有効になったとき、または lazy モジュールが存在しないあるいは無効なチャンクを指しているとき、それを明らかにします。これらは例外ではなく、高頻度のフロントエンド開発における日常的な産物です。バージョンドリフトは hydration エラー、ルーティングエラー、不一致なレンダリングの最も一般的な原因のひとつです。実際のブラウザ環境で実アプリを走らせる合成テストだけが、ユーザーに影響が出る前にこれらの問題を一貫して露呈できます。

CSR/SPA/SSR アプリのための監視ブループリント

ルーティング駆動アプリの堅牢な監視戦略は、一種類のチェックに頼ることはできません。層を必要とします。最も高い頻度では、ランタイムが起動しルーターが正しく初期化されるかを検証します。中程度の頻度では、主要なナビゲーションパスを実行し、コアビューが期待されたデータでレンダリングされることを確認します。より深いワークフローは頻度を下げて実行しますが、完全なユーザージャーニーをシミュレートし、孤立した画面ではなく一連の遷移を通じて状態がどのように振る舞うかを明らかにします。

API 監視は並行して行われるべきです。ルーティングが成功するのは、基盤となるサービスが一貫した応答を返したときだけです。アセットの整合性チェックは、バンドル、チャンク、CDN が配信するアーティファクトが同一のビルド系統に属することを保証して補完します。ペルソナベースのテストは、認証、役割、ロケール、フィーチャーフラグによって導入されるルーティング差異を捉え、ブループリントを完成させます。これらの組み合わせにより、初回読み込みの狭い視点ではなく、ランタイム全体にわたる運用上の可視性が得られます。

Dotcom-Monitor がルーティング対応監視をどのようにサポートするか

ルーティング駆動のアプリケーションは、マークアップのスナップショットではなく振る舞いを捉える監視を必要とします。これが私たち Dotcom-Monitor が採る視点です。私たちのブラウザベースのテストはユーザーと同じ方法でアプリケーションを評価し、ルート遷移に従い、非同期データフローを観察し、hydration 後にコンポーネントがインタラクティブになることを検証します。複数の地理とデバイスプロファイルから実行するため、CDN ドリフト、ネットワーク依存のルーティング問題、複数のナビゲーション後にのみ現れる微妙な障害を発見できます。

私たちのワークフロースクリプトは認証済み・未認証のパスを含む実際のユーザージャーニーをモデル化し、ページ単位のチェックでは決して検出できないルーティングや状態の問題を露呈します。私たちはランタイム自体—ルーター、データ層、進化するバンドルグラフ—に焦点を当てます。これがモダンなフロントエンドの信頼性を定義する要素だからです。SPA、CSR、SSR、ハイブリッドの各アーキテクチャにとって、この深い可視性はもはやオプションではなく必須要件です。

結論:ページではなくランタイムを監視する

クライアントサイドルーティングはウェブの振る舞いを永久に変えました。アプリケーションは各ナビゲーションで再起動しなくなりました。障害は壊れたページとして現れるのではなく、壊れた振る舞いとして現れます。監視はこの変化に対応するため進化しなければなりません。

ページロード、静的な DOM ツリー、サーバー応答を測るツールは、モダンな SPA、SSR、ハイブリッドの振る舞いを表現できません。監視はルーター、状態層、バンドルグラフ、そして実際のユーザー体験を定義するデータ依存に従う必要があります。

監視の未来はランタイムに対する認知です。振る舞いベースで、ルート駆動、バージョンに敏感で、フレームワークの実行に深く統合されています。初回描画しか監視し続ける組織は「緑」のダッシュボードを持ち続け、ユーザーは空白のパネルを見続けるでしょう。

ルーティングフレームワークは複雑性をサーバーからブラウザへ移しました。監視はそれに合わせて移動しなければなりません。

Matthew Schmitz
About the Author
Matthew Schmitz
Dotcom-Monitor 負荷テストおよびパフォーマンステスト担当ディレクター

Dotcom-Monitor の負荷テストおよびパフォーマンステスト担当ディレクターとして、Matt は現在、優秀なエンジニアや開発者のチームを率い、最も要求の厳しいエンタープライズニーズに対応する最先端の負荷テストおよびパフォーマンステストソリューションの開発に取り組んでいます。

Latest Web Performance Articles​

Dotcom-Monitorを無料で開始する

クレジットカード不要