BLOG ブログ


2024.10.04 TECH

Lighthouse CIでWebパフォーマンスの自動計測!

運営しているサイトのパフォーマンスはやはり気になりますよね?
私も現在所属しているプロジェクトでCore Web Vitalsの調査が必要となり対応しておりました!

でも毎回手作業で計測を行うのは面倒
そこで自動化するためにLighthouse CIというツールがあるため紹介します!

Core Web Vitals とは

まずはWebパフォーマンスを計測する上で知っておくべき指標、
Core Web Vitals について説明します!

Core Web Vitals は、
Googleが2020年に発表したWebページのユーザーエクスペリエンス(UX)を評価するための一連の指標です。

ここでのユーザーエクスペリエンス(UX)は、
ページの読み込みパフォーマンスインタラクティブ性視覚的安定性に関する内容が含まれます。

この指標は2021年にGoogle検索のランキングの一要素と取り入れられ、
SEOの1つとしてより注目されるようになりました。

指標について現在は以下の3つで構成されています。

Largest Contentful Paint(LCP)

  • 読み込みのパフォーマンスを測定します。
  • そのWebページ内にある最大の画像orテキストが表示されるまでの時間を指します。
  • 2.5秒以内表示されるのが良いとされています。

Interaction to Next Paint(INP)

  • インタラクティビティを測定します。
  • 2024年3月からFID(First Input Delay)という指標からINPに切り替わりました。
  • ユーザーからのアクション(ボタンクリックなど)に対して、視覚的な応答までの時間の最大値を指します
  • 200ミリ秒以内に応答されるのが良いとされています。

Cumulative Layout Shift(CLS)

  • 視覚的安定性を測定します。
  • そのWebページを読み込む過程で要素が移動する(レイアウトシフト)の合計スコアを指します。
  • スコアが0.1以下になるのが良いとされています。

ただ構成する指標はこれから変化があるかもしれないので、
情報をキャッチアップすることが大事です!

Lighthouse について

このCore Web Vitalsの指標を計測できるのがLighthouseで、
Googleより提供されているツールです。
他にもアクセシビリティやSEOについても検証可能です。

Lighthouseでの計測はChromeの開発者ツール上で実行が可能でしたが、
これらの機能をコマンド上で利用可能としたのがLighthouse CIになります。

ただ注意点としては、
INPはユーザーがそのページにアクセス〜全ての操作実行(クリックやキーボード入力)が範囲とされており、
現在のLighthouseでは計測が出来ない模様です。

代わりにインタラクションの指標として、
FID(初回のインタラクションの応答時間)は計測できるためこの後の導入についてはFIDで行います。
(FIDのスコアは100ミリ秒以内が良いとされています)

もしINPの計測を行いたい場合は、
PageSpeed Insightsで確認ができます。
こちらではフィールドデータ(Googleが収集している実際のユーザーによる使用状況の値)を元に算出されています。

プロジェクトに導入してみた

今回はNuxt.jsの初期ページに対して計測を行います!

①Nuxt.jsのプロジェクトを立ち上げる

$ npx nuxi@latest init nuxt3-lighthouse-ci

②Lighthouse CIをインストール

$ npm i -D @lhci/cli

③Lighthouse CIの設定ファイルの作成

ci:
  collect: 
    # 何回実行するか(複数回なら平均値がスコアになる)
    numberOfRuns: 1
    # 計測前の事前準備(ページの生成とサーバーの起動)
    startServerCommand: 'npm run generate && npm run preview'
    # サーバー起動の確認パターン
    startServerReadyPattern: 'Accepting connections at http://localhost:3000'
    # 対象となるページの設定
    url: 
      - http://localhost:3000/
  assert:
    assertions:
      largest-contentful-paint: # LCPの指標
        - 'error' # 警告の種類(warnも可能)
        - maxNumericValue: 2500 # 2.5秒以内を期待
      max-potential-fid: # FIDの指標
        - 'error'
        - maxNumericValue: 100 # 100ミリ秒以内を期待
      cumulative-layout-shift: # CLSの指標
        - 'error'
        - maxScore: 0.1 # 0.1スコア以内を期待

他ファイル形式でも作成可能です。

デフォルトでは低速4Gのネットワークスロットリングで検証となりますが、
異なる環境で検証したい場合は設定が必要です。

詳細な設定はドキュメントを参照ください!

④実行

$ npx lhci autorun

lhciコマンドには以下があります!

  • lhci collect
    • 指定のURLに対してLighthouseを実行する
  • lhci assert
    • Lighthouseの結果と設定した閾値でチェックする
  • lhci upload
    • Lighthouseの実行結果を指定サーバーにアップロードする
  • lhci autorun
    • collect / assert / upload が一貫して実行される
    • upload用の設定をしていない場合、uploadはスキップされる模様
  • lhci open
    • Lighthouseの実行レポート(HTML)を開く

⑤実行結果

成功パターン

$ npx lhci autorun

✅  .lighthouseci/ directory writable
✅  Configuration file found
✅  Chrome installation found
Healthcheck passed!

Started a web server with "npm run generate && npm run preview"...
Running Lighthouse 1 time(s) on http://localhost:3000/
Run #1...done.
Done running Lighthouse!

Checking assertions against 1 URL(s), 1 total run(s)

All results processed!

Done running autorun.

デフォルトページはコンテンツ量も多くないため成功します!

失敗パターン(全ての期待値を0に指定)

$ npx lhci autorun

✅  .lighthouseci/ directory writable
✅  Configuration file found
✅  Chrome installation found
Healthcheck passed!

Started a web server with "npm run generate && npm run preview"...
Running Lighthouse 1 time(s) on http://localhost:3000/
Run #1...done.
Done running Lighthouse!

Checking assertions against 1 URL(s), 1 total run(s)

2 result(s) for http://localhost:3000/ :

  ✘  largest-contentful-paint failure for maxNumericValue assertion
       Largest Contentful Paint
       https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/

        expected: <=0
           found: 1883.74365
      all values: 1883.74365


  ✘  max-potential-fid failure for maxNumericValue assertion
       Max Potential First Input Delay
       https://developer.chrome.com/docs/lighthouse/performance/lighthouse-max-potential-fid/

        expected: <=0
           found: 16
      all values: 16

Assertion failed. Exiting with status code 1.

assert command failed. Exiting with status code 1.

HTMLレポートを見る

$ npx lhci open

Google Chromeデベロッパーツール上でLighthouseを実行した時と同様な画面を見ることができます!

⑥CIに組み込む

今回はGitにpushされたらGithub Actionsが走り、Lighthouseが実行されるように設定しました。

name: CI
on: [push]
jobs:
  lighthouse-ci:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-node@v3
        with:
          node-version: 20
      - run: npm ci
      - run: npm run lighthouse

ローカルで実行した時と同様にLighthouseが実行できました!

まとめ

今回はLighthouse CIについて紹介をしていきました。

これらをサイトのCI/CDに組み込むことで、
追加実装によるパフォーマンスの低下を検知が可能になると思います!

導入については難しくないですが、
INPの計測がLighthouseでは出来ないところがあるので、
今後のアップデートに期待します!

Webパフォーマンスの改善をして、
ユーザーフレンドリーサービスの一歩を踏みましょう!

参考ページ


yuki_s_14
ライター名:yuki_s_14
永遠の駆け出しフロントエンドエンジニア
緑が好きだけど野菜が嫌いな人

主な記事一覧へ

一覧に戻る


LATEST ARTICLE 最新の記事

CATEGORY カテゴリー