搭建自動化 Web 頁面性能檢測系統 —— 設計篇

来源:https://www.cnblogs.com/dtux/archive/2023/05/26/17433983.html
-Advertisement-
Play Games

>我們是[袋鼠雲數棧 UED 團隊](http://ued.dtstack.cn/),致力於打造優秀的一站式數據中台產品。我們始終保持工匠精神,探索前端道路,為社區積累並傳播經驗價值。。 >本文作者:琉易 [liuxianyu.cn](https://link.juejin.cn/?target=h ...


我們是袋鼠雲數棧 UED 團隊,致力於打造優秀的一站式數據中台產品。我們始終保持工匠精神,探索前端道路,為社區積累並傳播經驗價值。。

本文作者:琉易 liuxianyu.cn

頁面性能對於用戶體驗、用戶留存有著重要影響,當頁面載入時間過長時,往往會伴隨著一部分用戶的流失,也會帶來一些用戶差評。性能的優劣往往是同類產品中勝出的影響因素,也是一個網站口碑的重要評判標準。

一、名稱解釋

前端監控一般分為合成監控和真實用戶監控。

1.1、合成監控

合成監控就是模擬用戶的使用場景,訪問一個頁面,通過一些工具和規則去檢測頁面,提取一些性能指標,生成一份檢測報告,註重檢測。

合成監控的優缺點:

優點 缺點
實現簡單,社區方案成熟 配置複雜,不能完全還原用戶真實場景
能採集到更豐富的數據 登錄等場景需要單獨處理
不影響真實用戶的頁面訪問性能 單次檢測數據不夠準確

1.2、真實用戶監控

file

真實用戶監控是指用戶在頁面上訪問,訪問時會產生各類性能數據,在用戶訪問停止的時候,將這些性能數據傳輸到服務端,進行數據整理分析的過程,註重監控。

真實用戶監控的優缺點:

優點 缺點
完全還原用戶真實場景 對用戶的訪問性能有一定影響
登錄等場景無需單獨解決 無法採集完整的資源載入瀑布圖
數據樣本足夠大且真實,數據價值高 無法可視化展示頁面載入過程

1.3、定義合適的性能指標

  1. 首次內容渲染時長(First Contentful Paint, FCP)
    頁面最新出現的內容渲染時長
  2. 首次展現平均值(Speed Index, SI)
    頁面內容可見填充的速度
  3. 最大內容繪製時間(Largest Contentful Paint, LCP)
    頁面核心內容呈現時間,不採用 loading 狀態的數據
  4. 可交互時間(Time to Interactive, TTI)
    用戶是否會體驗到卡頓
  5. 總阻塞時間(Total Blocking Time, TBT)
    主線程被阻塞的時間,無法作出輸入響應
  6. 累計佈局樣式偏移(Cumulative Layout Shift, CLS)

file

二、為什麼做

基於需要對公司的 Web 產品進行性能優化,在做性能優化的同時,優化的衡量標準也不可或缺。在頁面開發時觀察頁面的性能並不夠準確,因為不同的開發設備性能表現不同,所伴隨的變數也較多,不能夠準確的反映性能優化效果,也無法觀察產品的性能變化趨勢。為什麼自研呢,自研有以下好處:

(1)藉助第三方的性能檢測服務往往不能保證檢測數據的安全性。

(2)第三方的性能檢測服務一般無法與公司內部系統打通流程,一般無法自動化檢測公司內部產品。

(3)可以做一些自定義開發,比如根據產品特點調整不同的性能指標權重,從而更準確的計算分數。

那麼在檢測收集到了這麼多的指標數據後,頁面性能到底如何呢,如果你的老闆問你公司的產品頁面性能如何,你該如何回覆呢?假設列舉一大堆時間指標、偏移量等數據,老闆看到這些數值的時候可能就是一頭霧水,根本理解不了產品的頁面性能到底如何。那麼自研可以針對產品類型,給出一個統一的標準,這樣就方便去對比各個產品的性能表現了。

三、怎麼做

3.1、基礎依賴

下麵是檢測系統的整體架構:

file

這裡設計的性能檢測系統主要包含前端頁面和服務端,其中:

前端頁面展示性能檢測入口、檢測結果、性能趨勢、性能排行榜等。

服務端基於 Nestjs + Lighthouse + Puppeteer 實現,通過 Typeorm 操作 MySQL 資料庫,記錄和查詢性能檢測數據。

另外輔助一些插件進行定時監測、結果通知等操作,實現自動化檢測,相比頁面開發時通過開發者工具中的 Lighthouse 檢測有以下好處:

(1)不用開發者主動觸發;

(2)不會阻塞開發過程,無需等待;

Lighthouse 用於檢測 Web 網頁的性能,主要基於 4 個主要步驟實現,分別是交互驅動、性能數據收集、審計整理以及記錄。具體為:

(1)用戶在性能檢測入口輸入待檢測的頁面地址,點擊開始檢測,頁面通過介面調用性能檢測服務

(2)Lighthouse 遍歷當前頁面的收集器方法併合成一個總的收集器方法以便於採集數據

(3)對上述採集到的性能數據進行計算和評分

Lighthouse 主要提供六個收集器,通過以下六個收集器即可採集到和實際訪問接近的性能數據,每個收集器的功能不一,如下:

(1)收集 DOM 元素相關數據、DOM 節點最大深度、滾動條等

(2)收集頁面內的所有圖片資源,並記錄下每個圖片元素的寬高和定位等屬性

(3)收集相關指標,如:FCP、LCP、CLS 等

(4)收集 JS 事件監聽數量、JS 堆棧等

(5)收集頁面的所有請求,包括狀態碼、請求頭、響應頭、請求方式等

(6)收集 window.performance 下的性能數據,用於計算載入時間

Puppeteer 是 Chrome 團隊提供的一個無界面 Chrome 工具,俗稱無頭瀏覽器,通過提供的 API 可以控制 Node 端的 Chrome 工具進行指定的操作。在這裡設計的性能檢測系統中,由於 Lighthouse 進行檢測時打開的類似於無痕視窗,沒有登錄信息,所以 Puppeteer 主要幫助我們實現模擬登錄。

當檢測頁面需要登錄時,分析出頁面屬於哪個 devops 實例,然後通過 Puppeteer 跳轉到對應的登錄頁面,然後輸入用戶名、密碼、驗證碼,待登錄完成後跳轉至正確的頁面,再進行頁面性能檢測。如果登錄後還在登錄頁,表示登錄失敗,則獲取錯誤提示並拋出。

以下是檢測系統的一個流程圖:

file

3.2、關鍵代碼

// 開始檢測
async run(urlDto: UrlDto): Promise<object> {
    const start = new Date().getTime();
    try {
        const { url, loginUrl } = urlDto;
        const needLogin = url.includes('devops') || loginUrl;
        console.log(`本次檢測${needLogin ? '' : '不'}需要登錄`, url);

        const runResult = needLogin
            ? await this.withLogin(urlDto)
            : await this.withOutLogin(url);

        // 保存檢測結果文件,便於預覽
        const urlStr = url.replace(/http(s?):\/\//g, '').replace(/\//g, '');
        fs.writeFileSync(`./static/${urlStr}-report.html`, runResult?.report);

        // 性能數據
        const performance = runResult?.lhr?.categories?.performance || {};
        const data = {
            ...performance,
            auditRefs: performance?.auditRefs?.filter((item) => item.weight),
        };
        // console.log(data);
        console.log(`本次耗時:${((new Date().getTime() - start) / 1000).toFixed(2)}s`);

        return {
            code: 200,
            data,
            message: `耗時:${((new Date().getTime() - start) / 1000).toFixed(2)}s`,
        };
    } catch (error) {
        return {
            code: 401,
            message: error,
        };
    }
}

3.3、檢測規則

系統除了支持手動輸入網頁地址檢測,也支持自動檢測。為了便於統計每個子產品的真實表現,每天凌晨自動檢測 10 次,去掉最高分,去掉最低分,從其餘分數中選擇中位數作為每天的檢測評分。

性能檢測時的數據採集可能因為網頁服務的不穩定性,導致有偏大或偏小的數據,所以提供某個時間段某個指標的直方圖來分析數據的基本特征。也會提供某個產品的整體分數趨勢,便於統計某個時間段內該產品的性能變化,也可以提現性能優化前後的效果。

file

四、寫在後面

這篇文章簡單介紹了下該性能檢測系統的初步設計、一些頁面性能的概念以及採用的技術點,後續請關註《搭建自動化 Web 頁面性能檢測系統 —— 實踐篇》。


最後

歡迎關註【袋鼠雲數棧UED團隊】~
袋鼠雲數棧UED團隊持續為廣大開發者分享技術成果,相繼參與開源了歡迎star


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 準備測試表,先跟著執行下麵的SQL ```sql #1.登錄MySQL後 #2.創建test_database資料庫,不存在則創建 create database if not exists test_database; #2.1.如果test_database庫存在,可以根據自己意願刪除或換個名稱 ...
  • 這是從一個完整的茶文化網站採集下來的完整的內容,2萬多條的記錄數幾乎包含了關於茶信息的所有內容,而且內容格式經過嚴謹的整理不會顯示亂七八遭而是統一干爽的格式。憑此資料庫可以創建一個內容建全的茶網站。 模塊包含:茶的種類(497)、茶具知識(139)、茶農資料(1568)、茶葉技術(3437)、茶藝茶 ...
  • 關於菜譜類的數據這個博客里已經發現過幾次,但是關於數據量多一點的飲食方面的數據似乎沒有見過,即使有也是千把條數據,而今天採集的就是一個關於飲食方面網站的大量數據。 分類是根據模塊來區分的所以類別不是很多,詳細情況是:廚房寶典(969)、美食笑話(175)、新鮮食報(5770)、飲食文化(980)、營 ...
  • APP發佈到市場後,難免會遇到嚴重的BUG阻礙用戶使用,因此有在不發佈新版本APP的情況下使用熱更新技術立即修複BUG需求。原生APP(例如:Android & IOS)的熱更新需求已經比較成熟,但Flutter技術棧目前還缺少類似的技術方案,因此Flutter研發團隊,也需要類似的熱更新技術。 ...
  • 一說到創建桌面應用,就不得不提及Electron和Tauri框架。這次給大家主要分享的是基於electron最新版本整合vite4.x構建vue3桌面端應用程式。 之前也有使用vite2+vue3+electronc創建桌面端項目,不過 vue-cli-plugin-electron-builder ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 一、小票列印 目前市面上的小票印表機大多採用的列印指令集為ESC/POS指令,它可以使用ASCII碼、十進位、十六進位來控制列印,我們可以使用它來控制字體大小、列印排版、字體加粗、下劃線、走紙、切紙、控制錢箱等,下麵以初始化印表機為例: ...
  • apply(thisArg) apply(thisArg, argsArray) thisArg 在 func 函數運行時使用的 this 值。請註意,this 可能不是該方法看到的實際值:如果這個函數處於非嚴格模式下,則指定為 null 或 undefined 時會自動替換為指向全局對象,原始值會 ...
  • 具體的加密演算法可以可自行查詢其區別,這裡只是拋磚引玉,大部分加密方法基本都能通過改變傳入參數來實現。 C#相關類文檔: System.Security.Cryptography 命名空間 | Microsoft Learn Node JS相關文檔:Crypto | Node.js v16.20.0 ...
一周排行
    -Advertisement-
    Play Games
  • 概述:本文代碼示例演示瞭如何在WPF中使用LiveCharts庫創建動態條形圖。通過創建數據模型、ViewModel和在XAML中使用`CartesianChart`控制項,你可以輕鬆實現圖表的數據綁定和動態更新。我將通過清晰的步驟指南包括詳細的中文註釋,幫助你快速理解並應用這一功能。 先上效果: 在 ...
  • openGauss(GaussDB ) openGauss是一款全面友好開放,攜手伙伴共同打造的企業級開源關係型資料庫。openGauss採用木蘭寬鬆許可證v2發行,提供面向多核架構的極致性能、全鏈路的業務、數據安全、基於AI的調優和高效運維的能力。openGauss深度融合華為在資料庫領域多年的研 ...
  • openGauss(GaussDB ) openGauss是一款全面友好開放,攜手伙伴共同打造的企業級開源關係型資料庫。openGauss採用木蘭寬鬆許可證v2發行,提供面向多核架構的極致性能、全鏈路的業務、數據安全、基於AI的調優和高效運維的能力。openGauss深度融合華為在資料庫領域多年的研 ...
  • 概述:本示例演示了在WPF應用程式中實現多語言支持的詳細步驟。通過資源字典和數據綁定,以及使用語言管理器類,應用程式能夠在運行時動態切換語言。這種方法使得多語言支持更加靈活,便於維護,同時提供清晰的代碼結構。 在WPF中實現多語言的一種常見方法是使用資源字典和數據綁定。以下是一個詳細的步驟和示例源代 ...
  • 描述(做一個簡單的記錄): 事件(event)的本質是一個委托;(聲明一個事件: public event TestDelegate eventTest;) 委托(delegate)可以理解為一個符合某種簽名的方法類型;比如:TestDelegate委托的返回數據類型為string,參數為 int和 ...
  • 1、AOT適合場景 Aot適合工具類型的項目使用,優點禁止反編 ,第一次啟動快,業務型項目或者反射多的項目不適合用AOT AOT更新記錄: 實實在在經過實踐的AOT ORM 5.1.4.117 +支持AOT 5.1.4.123 +支持CodeFirst和非同步方法 5.1.4.129-preview1 ...
  • 總說周知,UWP 是運行在沙盒裡面的,所有許可權都有嚴格限制,和沙盒外交互也需要特殊的通道,所以從根本杜絕了 UWP 毒瘤的存在。但是實際上 UWP 只是一個應用模型,本身是沒有什麼許可權管理的,許可權管理全靠 App Container 沙盒控制,如果我們脫離了這個沙盒,UWP 就會放飛自我了。那麼有沒... ...
  • 目錄條款17:讓介面容易被正確使用,不易被誤用(Make interfaces easy to use correctly and hard to use incorrectly)限制類型和值規定能做和不能做的事提供行為一致的介面條款19:設計class猶如設計type(Treat class de ...
  • title: 從零開始:Django項目的創建與配置指南 date: 2024/5/2 18:29:33 updated: 2024/5/2 18:29:33 categories: 後端開發 tags: Django WebDev Python ORM Security Deployment Op ...
  • 1、BOM對象 BOM:Broswer object model,即瀏覽器提供我們開發者在javascript用於操作瀏覽器的對象。 1.1、window對象 視窗方法 // BOM Browser object model 瀏覽器對象模型 // js中最大的一個對象.整個瀏覽器視窗出現的所有東西都 ...