為什麼需要量測工具?#

「我自己用起來覺得很順」這種主觀感受並不能代表網站效能好。每個使用者所處的網路環境、裝置規格、瀏覽器版本都不同,光憑體感判斷會嚴重失真。更何況搜尋引擎也是透過自己的爬蟲來評估網站,演算法不會在意你個人的感受。

要客觀地了解一個網站到底快不快,必須仰賴專業的量測工具。本章會介紹三個目前業界常用的工具,並進一步示範如何把 Lighthouse 整合進 CI 流程,把效能檢測做成自動化的守門員。

  • Google PageSpeed Insights
  • WebPageTest
  • Lighthouse 與 Lighthouse CI

Google PageSpeed Insights#

PageSpeed Insights 是門檻最低的工具,只要在瀏覽器打開官方網址,把要檢測的 URL 貼進去就能立刻看到結果。它會分別呈現手機版與電腦版的分數,並列出主要的效能指標、資源大小統計與改善建議。

值得注意的是,PageSpeed Insights 背後其實也是用 Lighthouse 的資料計算出來的。差別在於它的呈現方式比較精簡、操作極為直覺,連手機都能直接量測,因此非常適合「快速看一下這個網站大概表現如何」這類需求。

雖然 PageSpeed Insights 用起來很方便,但它呈現的細節遠比直接執行 Lighthouse 來得少。需要深入分析時還是建議用 Lighthouse 取得完整報告。

WebPageTest#

WebPageTest 最大的優勢是「可以輕鬆切換不同瀏覽器、不同地理位置進行檢測」。Lighthouse 與 PageSpeed Insights 是 Google 自家工具,對 Chrome 的支援自然最好;如果想知道網站在 Firefox、Edge 或是不同國家節點下的表現,WebPageTest 是更合適的選擇。

它的設定選項也比較豐富,可以指定連線速率、測試次數、測試地點等等。代價是執行速度偏慢,每次跑完一輪要等比較久。

Google Lighthouse#

Lighthouse 是日常開發中最推薦的主力工具。它一次會輸出多個面向的分數:

  • Performance
  • Accessibility
  • Best Practices
  • SEO
  • Progressive Web App(PWA)

除了給出分數以外,它還會針對每個指標列出具體的改進建議,例如哪張圖片太大、哪段 JavaScript 阻塞了渲染等等。對開發者來說等於是「免費的效能顧問」。

Lighthouse 的執行方式有兩種:

  • 安裝 Chrome 擴充功能後,在任何網站上點擊 Generate Report。
  • 開啟 Chrome DevTools,切到 Lighthouse 分頁直接執行。

兩種方式產出的報告完全相同,差別只在使用習慣。

Lighthouse CI:把效能檢測接進 CI/CD#

前面三個工具都是「網站部署完成之後」才能跑的。但實務上一次推版可能涵蓋好幾十個 commit 與 PR,如果某個 commit 拖垮了效能,事後想追查是哪一筆改動造成的會非常困難。

Lighthouse CI 就是為了這個情境而生。它把 Lighthouse 的檢測能力包裝成 CLI,可以在 CI/CD 流程中自動執行;甚至可以細到「每次 commit 都跑一次,並比對前後分數差異」。配合 GitHub App 還能直接在 Pull Request 上做 status check,讓問題在 code review 階段就被攔下來。

實作示範#

下面以 GitHub Actions 為例,示範一個最小可用的 Lighthouse CI 設定。整體流程的目標是:

  • 每次 push 都自動跑 Lighthouse,未達標就讓 CI 失敗。
  • 每次發 Pull Request 時自動掛上 status check,未達標就標記為 failed。

步驟一:安裝 Lighthouse CI GitHub App#

到 Lighthouse CI 的 GitHub App 頁面安裝到目標 repository,安裝完畢會拿到一組 token。把 token 加到 repository 的 Settings ➡️ Secrets,命名為 LHCI_GITHUB_APP_TOKEN

步驟二:撰寫 GitHub Actions workflow#

在專案根目錄建立 .github/workflows/lighthouse-demo.yml

name: Lighthouse CI demo
on: [push]
jobs:
  lhci:
    name: Lighthouse CI
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v1
      - name: Use Node.js
        uses: actions/setup-node@v1
        with:
          node-version: 12.x
      - name: Install and build
        run: |
          yarn
          npm run build
      - name: Run Lighthouse CI
        run: |
          npm install -g @lhci/cli@0.3.x
          lhci autorun --upload.target=temporary-public-storage || echo "LHCI failed!"
        env:
          LHCI_GITHUB_APP_TOKEN: ${{ secrets.LHCI_GITHUB_APP_TOKEN }}

重點在於最後一步:執行 lhci autorun,並把上一階段拿到的 token 透過環境變數傳進去。temporary-public-storage 表示報告會上傳到 Google 提供的暫存空間,方便檢視。

步驟三:定義通過 / 不通過的條件#

只是跑 Lighthouse 還不夠,必須訂出「分數低於多少時要 fail」這樣的規則。在專案根目錄建立 .lighthouserc.json

{
  "ci": {
    "assert": {
      "preset": "lighthouse:no-pwa",
      "assertions": {
        "categories:performance": [
          "warn",
          { "aggregationMethod": "optimistic", "minScore": 0.93 }
        ],
        "categories:accessibility": [
          "error",
          { "aggregationMethod": "optimistic", "minScore": 0.95 }
        ]
      }
    }
  }
}

這份設定的意思是:

  • Performance 分數低於 0.93 時顯示 warning。
  • Accessibility 分數低於 0.95 時直接報 error,CI 會 fail。

完整的 assertion 設定可以參考 Lighthouse CI 的官方文件,可以針對個別 metric(例如 LCP、TBT)設定門檻,彈性非常高。

一開始不用把門檻設得太嚴。建議先量測現況,再以「不退步」為基礎逐步往上拉,否則一開始就高標反而會讓團隊一直在處理紅色 CI。

整合後的效果#

設定完成後,每次 push 與 PR 都會自動跑 Lighthouse;未達門檻時 status check 會直接顯示 failed。點進去報告還能看到該 commit 造成各個指標的具體變化,等於是把效能監控做進日常 code review 流程,而不是等使用者抱怨才發現問題。

本章重點#

  • 量測工具是效能優化的起點,沒有量測就沒有優化。
  • PageSpeed Insights 上手最快,WebPageTest 適合跨瀏覽器與跨地區測試,Lighthouse 是日常主力。
  • Lighthouse CI 把效能檢測整合進 CI/CD,可以攔截造成退化的 commit / PR。
  • 配合 .lighthouserc.json 可以細緻設定通過條件,是團隊化效能管理的關鍵。

原文出處#