搭建自動化 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
  • GoF之工廠模式 @目錄GoF之工廠模式每博一文案1. 簡單說明“23種設計模式”1.2 介紹工廠模式的三種形態1.3 簡單工廠模式(靜態工廠模式)1.3.1 簡單工廠模式的優缺點:1.4 工廠方法模式1.4.1 工廠方法模式的優缺點:1.5 抽象工廠模式1.6 抽象工廠模式的優缺點:2. 總結:3 ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 本章將和大家分享ES的數據同步方案和ES集群相關知識。廢話不多說,下麵我們直接進入主題。 一、ES數據同步 1、數據同步問題 Elasticsearch中的酒店數據來自於mysql資料庫,因此mysql數據發生改變時,Elasticsearch也必須跟著改變,這個就是Elasticsearch與my ...
  • 引言 在我們之前的文章中介紹過使用Bogus生成模擬測試數據,今天來講解一下功能更加強大自動生成測試數據的工具的庫"AutoFixture"。 什麼是AutoFixture? AutoFixture 是一個針對 .NET 的開源庫,旨在最大程度地減少單元測試中的“安排(Arrange)”階段,以提高 ...
  • 經過前面幾個部分學習,相信學過的同學已經能夠掌握 .NET Emit 這種中間語言,並能使得它來編寫一些應用,以提高程式的性能。隨著 IL 指令篇的結束,本系列也已經接近尾聲,在這接近結束的最後,會提供幾個可供直接使用的示例,以供大伙分析或使用在項目中。 ...
  • 當從不同來源導入Excel數據時,可能存在重覆的記錄。為了確保數據的準確性,通常需要刪除這些重覆的行。手動查找並刪除可能會非常耗費時間,而通過編程腳本則可以實現在短時間內處理大量數據。本文將提供一個使用C# 快速查找並刪除Excel重覆項的免費解決方案。 以下是實現步驟: 1. 首先安裝免費.NET ...
  • C++ 異常處理 C++ 異常處理機制允許程式在運行時處理錯誤或意外情況。它提供了捕獲和處理錯誤的一種結構化方式,使程式更加健壯和可靠。 異常處理的基本概念: 異常: 程式在運行時發生的錯誤或意外情況。 拋出異常: 使用 throw 關鍵字將異常傳遞給調用堆棧。 捕獲異常: 使用 try-catch ...
  • 優秀且經驗豐富的Java開發人員的特征之一是對API的廣泛瞭解,包括JDK和第三方庫。 我花了很多時間來學習API,尤其是在閱讀了Effective Java 3rd Edition之後 ,Joshua Bloch建議在Java 3rd Edition中使用現有的API進行開發,而不是為常見的東西編 ...
  • 框架 · 使用laravel框架,原因:tp的框架路由和orm沒有laravel好用 · 使用強制路由,方便介面多時,分多版本,分文件夾等操作 介面 · 介面開發註意欄位類型,欄位是int,查詢成功失敗都要返回int(對接java等強類型語言方便) · 查詢介面用GET、其他用POST 代碼 · 所 ...
  • 正文 下午找企業的人去鎮上做貸後。 車上聽同事跟那個司機對罵,火星子都快出來了。司機跟那同事更熟一些,連我在內一共就三個人,同事那一手指桑罵槐給我都聽愣了。司機也是老社會人了,馬上聽出來了,為那個無辜的企業經辦人辯護,實際上是為自己辯護。 “這個事情你不能怪企業。”“但他們總不能讓銀行的人全權負責, ...