頁面壞UV效能最佳化

架構師修行手冊發表於2023-10-18

來源:之家技術

1. 前言

在網際網路時代,網路應用的效能對於使用者體驗、市場競爭力和公司聲譽至關重要。隨著Web技術的不斷髮展,使用者對網頁載入速度和響應速度的期望不斷提高。因此客觀、標準地衡量頁面效能對於最佳化頁面具有關鍵性的指導作用。透過準確地評估效能瓶頸和問題所在,我們可以更有效地調整和最佳化頁面,從而改善使用者體驗,提高市場競爭力。


2. 關鍵指標


頁面壞UV效能最佳化


2.1

 FCP (First Contentful Paint)

首次內容繪製,標記瀏覽器渲染來自 DOM 第一位內容的時間點,內容可能是文字、影像等元素,是使用者感知載入速度的一個重要指標。
頁面壞UV效能最佳化

2.2

LCP (Largest Contentful Paint)

最大內容繪製時間,計算從頁面開始載入到使用者與頁面發生互動(點選,滾動)這段時間內,最大元素繪製的時間,該時間會隨著頁面渲染變化而變化,因為頁面中的最大元素在渲染過程中可能會發生改變。
頁面壞UV效能最佳化

2.3

LCP (Largest Contentful Paint)

累計佈局偏移。測量在頁面的整個頁面生命週期內發生的所有意外佈局偏移中累計的佈局偏移分數。
頁面壞UV效能最佳化

更多的頁面指標不在重複解釋,感興趣可以檢視https://web.dev/metrics/


3. 衡量指標

效能指標一般透過以下兩種方式來進行測量: 
  • 在實驗場景中:使用工具在穩定、受控的環境中模擬頁面載入
        1、Chrome 開發者工具
        2、lighthouse
        3、WebPageTest
  • 在實際場景中:基於真實使用者的實際頁面載入與頁面互動
       1、ftwo 之家基於web-vitals包裝的前端效能採集工具
       2、Chrome User Experience Report 是google的效能檢測工具,透過引入google提供的指令碼,將我們的客戶端資料上報google,從而統計你的網頁的效能報告和評估
      如何衡量線上頁面站點效能,推薦使用之家的ftwo前端線上採集工具,基於真實使用者實際瀏覽過程中收集相關指標,壞體驗的UV指標參照如下,壞UV佔比控制在25%以下
頁面壞UV效能最佳化

4. 最佳化措施

4.1

網路層面


開啟Gzip壓縮

gzip 是 GNUzip 的縮寫,最早用於 UNIX 系統的檔案壓縮。HTTP 協議上的 gzip 編碼是一種用來改進 web 應用程式效能的技術,web 伺服器和客戶端(瀏覽器)必須共同支援 gzip。目前主流的瀏覽器,Chrome,firefox,IE 等都支援該協議。常見的伺服器如 Apache,Nginx,IIS 同樣支援,gzip 壓縮效率非常高,通常可以達到 70% 的壓縮率。


►使用 HTTP 2

HTTP2.0 大幅度的提高了 web 效能,在 HTTP1.1 完全語義相容的基礎上,進一步減少了網路的延遲。實現低延遲高吞吐量。


► 使用CDN

使用內容分發網路(CDN)是一種最佳化頁面效能的有效方法,它能夠縮短網路載入時間,為使用者提供更快的訪問速度。CDN 將網站的靜態資源(如文件、圖片、樣式表、指令碼等)複製到分佈在各地的伺服器上,使使用者能夠從離他們較近的伺服器上載入資源,從而減少網路延遲。

為了從 CDN 中獲得最佳效能,應針對文件、資源和介面分別設定合適的快取時長。以下是一些建議:
  1. 文件:對於 HTML 文件,建議設定較短的快取時長(如幾分鐘到幾小時),以便在內容發生更改時,使用者能夠儘快獲取到更新後的內容。
  2. 資源:對於 CSS、JavaScript 等靜態資源,可以設定較長的快取時長(如一週到一個月),因為這些資源的更新頻率通常較低。但務必確保資源具有唯一的版本號或雜湊值,以便在更新時使快取失效。
  3. 介面:對於 API 介面,快取時長的設定要根據資料更新頻率進行調整。如果資料經常發生變化,建議使用較短的快取時長;如果資料變化不大,可以使用較長的快取時長。同時要注意合理設定快取策略,如 Cache-Control 頭部,以確保資料的實時性和準確性。

透過使用 CDN 併合理設定快取時長,我們可以顯著提高頁面載入速度,最佳化使用者體驗,並節省伺服器頻寬和資源。


4.2

圖片最佳化

     圖片往往是一個 h5 頁面的重要組成部分,然而圖片佔用的資源往往也是很大的,因此圖片最佳化在效能最佳化中佔據很重要的地位。下面來看幾種最佳化圖片的方式。

  • 圖片懶載入:當圖片出現在可視區域或者即將出現在可視區域時再載入圖片,避免一次性載入全部圖片,會對使用者體驗造成很大影響。

  •  降低圖片質量:一些圖片適當降低圖片質量時,通常是看不出來區別的,尤其是作為背景圖片時,可以使用dis命令進行圖片壓縮。

  • 儘量使用CSS代替圖片:一些簡單的圖片效果如果可以透過 CSS 效果實現則進行用 CSS 來實現,可以減小請求次數或者打包體積大小。

  • 圖片指定尺寸:圖片裁剪成合適尺寸大小,img元素固定寬高,避免因網路載入導致頁面抖動。

  • 使用webp圖片:WebP 的優勢體現在它具有更優的影像資料壓縮演算法,能帶來更小的圖片體積,而且擁有肉眼識別無差異的影像質量;同時具備了無損和有損的壓縮模式、Alpha 透明以及動畫的特性,在 JPEG 和 PNG 上的轉化效果都相當優秀、穩定和統一。


4.3

程式碼最佳化

► 第三方外掛、庫按需引入
   在專案中經常會使用到第三方的外掛,比如在模板頁中引入或是全域性註冊,會導致專案首屏資源體積增加,改成元件內區域性註冊或是動態引入lib的地址

► 動態元件,按需引入
場景一: 在我們營銷專題頁中彈窗種類很多,但是實際在使用者端彈出使用時刻,只會是一兩個彈窗。因此統一所有彈窗的入口,在透過動態元件只彈窗某一個彈窗。
頁面壞UV效能最佳化
頁面壞UV效能最佳化
頁面壞UV效能最佳化
頁面壞UV效能最佳化
頁面壞UV效能最佳化


場景二:  長頁面,板塊很多,而且都是城市維度的動態資料,
非首屏的板塊,提前預熱計算板塊是否存在,透過動態元件和板塊的高度,當滑動可視視窗才開始下載資源和渲染。


頁面壞UV效能最佳化


► 動態元件有序顯示
透過指令和元件完成狀態,實現元件有序顯示,避免出現頁面CLS偏移。


(1)自定義指令v-module-status,繫結兩個引數一個版塊的順序,一個版塊的執行完成狀態。
(2)定義一個全域性元件狀態儲存物件,儲存頁面使用了v-module-status指令的元件狀態資料。
(3)指令中檢查當前元件的執行完成狀態是否完成,若完成,則遍歷全域性元件狀態儲存物件,查詢出當前元件之前的所有元件,檢視是否之前的所有元件已經完成介面請求,如果完成則把當前元件的display:none移除,反之設定成display:none,同時當前之後的所有元件也進行更新是否顯示的狀態。
(4)使用指令的元件內部需要配合設定一個介面請求完成狀態的標識,傳遞給指令,能保證指令可以拿到當前元件的介面請求狀態。

► 去掉頁面端重定向
廣告位投放中間頁,根據一定條件,跳轉不同的落地頁,影響頁面的重定向時長。

► 去掉頁面端自動錨點
     帶車系投遞(高意向度)滾動錨點至猜你喜歡板塊,不帶車系通投(低意向度)錨點到SKU板塊;猜你喜歡、SKU板塊中間存在N個動態的板塊,自動錨點時,頁面會不斷跳動,給使用者帶來不友好的體驗。
頁面壞UV效能最佳化

指定車系投放

無車系通投

頁面壞UV效能最佳化
為了改善使用者體驗,建議採取以下措施之一:
1.   去掉自動錨點功能,讓使用者自主地瀏覽頁面和板塊,避免頁面頻繁跳動。
2.   最佳化自動錨點邏輯,在使用者關閉半屏開屏彈窗後再進行錨點跳轉。這樣一來,使用者可以先關注彈窗內容,並在關閉後再被引導至相應板塊,從而減少頁面跳動現象。


► vue 路由懶載入

當打包構建應用時,JavaScript 包會變得非常大,影響頁面載入。如果我們能把不同路由對應的元件分割成不同的程式碼塊,然後當路由被訪問的時候才載入對應元件,這樣就更加高效了。
let router = createSimpleRouter({
    routes: [
        {
            path`${URL_PREFIX}/index`,
            name"index",
            component() => import(/* webpackChunkName: "index" */ '../views/index/Index'),
            meta: meta
        },
        {
            path`${URL_PREFIX}/cities`,
            name"cities",
            component() => import(/* webpackChunkName: "cities" */ '../views/cities/Index'),
            meta: {
                ...meta,
                subcategoryId11750,
            }
        },
        {
            path`${URL_PREFIX}/success/:encryptedOrderId`,
            name"success",
            component() => import(/* webpackChunkName: "success" */ '../views/success/Index'),
            meta: {
                ...meta,
                subcategoryId14393,
            }
        }]
});

參考連結

https://web.dev/metrics/


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70027824/viewspace-2989591/,如需轉載,請註明出處,否則將追究法律責任。

相關文章