使用 web-vitals 監控 web app 的性能

是什麼?
Vitals
英漢翻譯:
n. 命脈(vital的複數);(人體的)重要器官;要害
網絡釋義:
vitals: 重要器官 Striking the Vitals: 攻其要害
web vitals [1] 指的是一些關鍵指標,可以用來量化網頁的用户體驗,定義如何改進網頁的質量(這是 google 推出的用户體驗量化指標)。從 React 16 到 React 17 我們可以看到一個變化是原先 /src 目錄下的 serviceWorker [2] 被替換成了 webVitals,React 團隊可能認為對於大多數 web 應用 webVitals 相比 serviceWorker 更有用。 這裏 [3] 有一個 google 開源的實現,相關下載也很簡單:
npm install web-vitals
有哪些關鍵指標

這些關鍵指標只是 web vitals 的一個子集,不是全部,但幾乎每個網站都需要關注這三個指標:
LCP(Largest Contentful Paint)
最大內容渲染時間:指的是從用户請求網址到窗口中渲染最大可見內容所需要的事件(最大可見內容通常是圖片或者視頻,或者大塊的文本)
FID(First Input Delay)
首次輸入延遲:指的是從用户首次與網頁互動(點擊鏈接、按鈕等)到瀏覽器響應此次互動直接的時間。用於判斷網頁進入互動狀態的時間。
CLS(Cumulative Layout Shift)
累計佈局偏移:得分範圍0-1,指的是網頁佈局在加載期間的偏移量,0表示沒有偏移,1表示最大偏移,這個指標指示用户與網站的交互體驗,如果網址在加載過程佈局一直跳動,用户體驗會很差。比如加載一張圖片,但沒有大小空白佔位,導致圖片顯示時頁面高度跳動。
哪些測量工具支持這些指標?
測量工具 | LCP | FID | CLS |
Chrome User Experience Report | ✔ | ✔ | ✔ |
PageSpeed Insights | ✔ | ✔ | ✔ |
Search Console (Core Web Vitals report) | ✔ | ✔ | ✔ |
如果你使用 chrome,還可以使用這個 chrome 插件 [4] ,可以直接看到網頁的指標,如圖:

怎樣的指標才算好?
一般可以按下面表格評估應用的用户體驗:
良好 | 需要改進 | 速度慢 | |
LCP | <=2.5 秒 | <=4 秒 | >4 秒 |
FID | <=100 毫秒 | <=300 毫秒 | >300 毫秒 |
CLS | <=0.1 | <=0.25 | >0.25 |
怎麼用?
簡單打印指標
React 17 開箱代碼已經提供了基本使用方法:
import { ReportHandler } from 'web-vitals';
const reportWebVitals = (onPerfEntry?: ReportHandler) => {
if (onPerfEntry && onPerfEntry instanceof Function) {
import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {
getCLS(onPerfEntry);
getFID(onPerfEntry);
getFCP(onPerfEntry);
getLCP(onPerfEntry);
getTTFB(onPerfEntry);
});
}
};
export default reportWebVitals;
在 index.ts 中簡單使用:
import React from 'react';
import ReactDOM from 'react-dom';
import './index.scss';
import App from './App';
import reportWebVitals from './reportWebVitals';
ReactDOM.render(
<React.StrictMode>
<App/>
</React.StrictMode>,
document.getElementById('root')
);
reportWebVitals(console.log);
這樣可以看到類似的打印信息:

與 google analytics 結合使用(前提已經部署 analytics.js 或者 gtag.js 代碼)
使用 analytics.js
function sendToGoogleAnalytics({name, delta, id}) {
ga('send', 'event', {
eventCategory: 'Web Vitals',
eventAction: name,
eventLabel: id,
// analytics 只能接受整數
eventValue: Math.round(name === 'CLS' ? delta * 1000 : delta),
nonInteraction: true,
transport: 'beacon',
});
}
使用 gtag.js
function sendToGoogleAnalytics({name, delta, id}) {
gtag('event', name, {
event_category: 'Web Vitals',
event_label: id,
value: Math.round(name === 'CLS' ? delta * 1000 : delta),
non_interaction: true,
});
}
可以在 google analytics 的事件中看到:

我們隨便點進一個事件 CLS,可以看到監控數據:

可以看到整體 CLS <= 0.1,説明網頁加載過程中沒有過大的頁面跳動,用户體驗較好
參考資料
Web Vitals [5]
GoogleChrome/web-vitals [6]
Getting started with measuring Web Vitals [7]
Measuring Performance [8]
"核心網頁指標"報告 [9]
Google Analytics中gtag.js和analytics.js到底有什麼區別 [10]
References
[1]
web vitals: https://web.dev/vitals/
[2]
serviceWorker: https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API
[3]
這裏: https://github.com/GoogleChrome/web-vitals
[4]
chrome 插件: https://chrome.google.com/webstore/detail/web-vitals/ahfhijdlegdabablpippeagghigmibma?hl=en
[5]
Web Vitals: https://web.dev/vitals/
[6]
GoogleChrome/web-vitals: https://github.com/GoogleChrome/web-vitals
[7]
Getting started with measuring Web Vitals: https://web.dev/vitals-measurement-getting-started/
[8]
Measuring Performance: https://create-react-app.dev/docs/measuring-performance/
[9]
"核心網頁指標"報告: https://support.google.com/webmasters/answer/9205520?hl=zh-Hans
[10]
Google Analytics中gtag.js和analytics.js到底有什麼區別: https://www.guozhenyi.com/p/anb8h35744d8
- 像專業人員一樣驗證你的Vue Props
- 如何在用户離開頁面時可靠地發送 HTTP 請求
- 將自定義 GitHub 徽章添加到您的代碼庫
- 使用 web-vitals 監控 web app 的性能
- 真沒必要再對 axios 進行過度的封裝
- 你應該知道的 7 個 GitHub 功能
- 集美美圖APP 2.0.0 版本上線了
- 你的應用應該如何收費?它的價值是什麼?
- xgplayer.js 西瓜播放器 - 字節跳動團隊出品的免費開源 HTML5 視頻播放組件,內置解析器、也能節省流量
- 2天,我把 TS 的事件循環模型、服務端、模擬登陸擼乾淨了!
- 8 個令人驚歎的 Vue.js UI 組件,説不定用得上!
- Vue.js Astro 比 Vue SPA 更好嗎?
- 使用 node-config 在 Node.js 中創建配置文件
- 2022年全棧開發者需要具備的六項技能
- 使用 Chrome Web 藍牙 API 構建藍牙應用
- 生成唯一ID,為什麼 NanoID 會取代 UUID?
- 在 Flutter 中更快地加載圖像資源!
- Clio lang 簡介:輕鬆交付性能關鍵型 JS
- 20個你應該瞭解的Flutter庫
- 厭倦了 VS Code?試試 Lite-XL吧