⏱️

Web の仕様を眺めるシリーズ Soft Navigations Performance Entry | Offers Tech Blog

2024/01/30に公開

Offers を運営している株式会社 overflowあほむ でございます。

本記事は Chrome Platform Status からなんとなく Proposed/In Development etc なステータスのフィーチャーを取り上げて、そのプロポーザルを眺めてみるシリーズです。前回は form-sizing field-sizing CSS property でした。

SPA 的な画面遷移を性能計測したい

今回は Soft Navigations Performance Entry を眺めてみます。本当に眺めるだけで深入りしないので概要のみのライトな記事とご認識ください。

SPA 的な画面遷移とはつまり History.pushStateHistory.replaceState を用いた JavaScript 駆動なナビゲーションを指します。このような遷移を指してここでは Soft Navigations と呼称しています。

https://github.com/WICG/soft-navigations/blob/main/README.md

Soft Navigations の仕様は Draft Community Group Report として公開されています。

SPA と Performance RUM

SPA (Single Page Application) における RUM (Real User Monitoring) は下記のような課題を抱えています。

  • ランディング URL の指標しか計測されない
  • SPA の特性上ランディングは不利になりやすい
  • SPA の優れたユーザー体験が計測上スポイルされる
  • SPA より MPA のほうが Web Vitals 的に有利になるのか

これらの課題が検索ランキング要因を強く意識している前提として Soft Navigations は Google の提案です。モチベーションとして LCP や CLS といった Web Vitals に紐付く Google 提唱の速度指標を測定可能にするための仕様と言っても過言ではないでしょう。

2020 年頃の記事ですが How SPA architectures affect Core Web Vitals ではそのあたりの事を含めて触れられています。

SoftNavigationEntry が流れてくる

A Soft Navigation is a same document navigation which satisfies the following conditions:

  • Its navigating task is a descendent of a user interaction task.
  • There exists a DOM node append operation whose task is a descendent of the same user interaction task.

via. wicg.github.io/soft-navigations/#sec-algos

  • ナビゲーションがユーザーインタラクション由来であること
  • 同じユーザーインタラクション由来で DOM の追加操作があること

これらを条件に Soft Navigations が発生したと判定して Performance Timeline に SoftNavigationEntry が流れてくるようになります。

本稿執筆時点で提案されている API

例によって chrome://flags/#enable-experimental-web-platform-features を有効にすると実験的に Soft Navigations Performance Entry を試せるようになっています。

以下のサンプルコードは Experimenting with measuring soft navigations からの引用です。

new PerformanceObserver((entryList) => {
  for (const entry of entryList.getEntries()) {
    console.log('Layout Shift time:', entry);
  }
}).observe({type: 'layout-shift', buffered: true, includeSoftNavigationObservations: true});

既存の PerformanceObserver を利用する際に includeSoftNavigationObservations オプションを有効にすると Soft Navigations 相当の計測が可能になります。

多くの場合は PerformanceObserver を直接使う代わりに GoogleChrome/web-vitals を使うことになるでしょう。次のコードは Web Performance Calendar » Beyond soft-navigations: tracking your SPA’s TTFB からの引用サンプルコードです。

(function() {
  var script = document.createElement('script');
  script.src = 'https://unpkg.com/web-vitals@soft-navs/dist/web-vitals.attribution.iife.js';
  script.onload = function() {
    webVitals.onTTFB(console.log, {reportSoftNavs: true});
    webVitals.onLCP(console.log, {reportSoftNavs: true});
    webVitals.onCLS(console.log, {reportSoftNavs: true});
    webVitals.onINP(console.log, {reportSoftNavs: true});
  }
  document.head.appendChild(script);
}());

reportSoftNavs オプションが設けられています。当該ライブラリにおける各指標の計測実装の実態は GoogleChrome/web-vitals の soft-navs ブランチ を参照すると分かります。本稿執筆時点では soft-navs ブランチを参照しないと利用できません。

まとめ

ということで例によって簡単ながら Soft Navigations Performance Entry をご紹介しました。

SEO 抜きでも本来のユーザー体験を計測可能にしたい気持ちは分かりますし、LCP、CLS、INP(FID) みたいな指標は User Timings では代替できないので然もありなんと言ったところでしょうか。

参考リソース

関連記事

https://zenn.dev/overflow_offers/articles/20231003-form-sizing-normal
https://zenn.dev/overflow_offers/articles/20230224-media-queries-nav-controls
https://zenn.dev/overflow_offers/articles/20230209-scroll-timeline-for-web-animatinos

GitHubで編集を提案
Offers Tech Blog

Discussion