如何利用燭龍和谷歌插件優化CLS(累積佈局偏移)

来源:https://www.cnblogs.com/Jcloud/archive/2023/12/18/17910409.html
-Advertisement-
Play Games

CLS 衡量的是頁面的整個生命周期內發生的每次意外佈局偏移的最大突發性_佈局偏移分數_。佈局變化的發生是因為瀏覽器傾向於非同步載入頁面元素。更重要的是,您的頁面上可能存在一些初始尺寸未知的媒體元素。這種組合意味著瀏覽器在載入完成之前無法確定單個元素將占用多少空間。因此,這種不確定性帶來的劇烈佈局轉變就... ...


簡介

CLS 衡量的是頁面的整個生命周期內發生的每次意外佈局偏移的最大突發性_佈局偏移分數_。佈局變化的發生是因為瀏覽器傾向於非同步載入頁面元素。更重要的是,您的頁面上可能存在一些初始尺寸未知的媒體元素。這種組合意味著瀏覽器在載入完成之前無法確定單個元素將占用多少空間。因此,這種不確定性帶來的劇烈佈局轉變就會導致一個高的CLS分數,也就說明用戶體驗將會很糟糕。

累積佈局偏移的計算公式 = 影響比例*距離比例(參考:https://web.dev/articles/cls?hl=zh-cn

影響比例:上一幀的所有不穩定元素與當前幀的可見區域(占視口總面積的比例)的並集就是當前幀的影響比例。

距離比例:距離比例是任何_不穩定元素_在框架內的移動距離(水平或垂直方向)的最大距離除以視口的最大尺寸(寬度或高度,以較大者為準)

解決方案

  1. 找到可能導致累積佈局偏移的所有因素

  2. 確定是什麼因素導致瞭如此大的累計佈局偏移? 我們需要找到一個靠譜的工具輔助我們確認,並定位到具體原因。

  3. 導致出現這些原因的問題代碼有哪些 ? 找到代碼後,我們應該如何解決。

方案執行

1 導致累積佈局偏移的因素

導致 CLS 不佳的最常見原因包括:

  • 沒有尺寸的圖片
  • 無尺寸的廣告、嵌入內容和 iframe
  • 動態註入的內容,例如沒有尺寸的廣告、嵌入內容和 iframe
  • 網頁字體

2 使用輔助工具,確認是哪幾種因素

可以先利用內部監控平臺找到用戶最常訪問的頁面,利用lighthouse逐個分析每個頁面的性能

(註意:站外的小伙伴可以根據自己的系統的瞭解,找出用戶的常用頁面~)

案例--以我們的項目A為例

  1. 在性能業務概覽中,我們通過比對訪問量Top10Url性能對比和頁面性能上報量top100列表,發現用戶訪問最多的是兩個頁面——首頁A列表和B詳情頁

  2. 使用lighthouse在本地分別分析兩個頁面的性能(點擊analyze page load按鈕即可觸發檢測,為保證整體性能偏向真實場景,推薦大家在檢測中進行一些當前頁面的常規操作)

性能截圖分別如下:

  1. A列表

2. B詳情頁

3 解決方案

根據以上報告中給出的造成CLS數值極大的原因,逐條修改

其中,造成首頁A列表數據CLS異常的主要原因有兩個:一是excel圖片沒有尺寸;二是table表格的高度沒有明確設置,導致介面返回數據後直接在屏幕中動態填充,造成累積佈局偏移較大。造成B詳情頁CLS異常的主要原因也同首頁一樣,table高度未設置,導致CLS偏大。

針對以上兩種原因,分別做如下修改:

  1. 根據圖片原尺寸指定 aspect-ratio,改動後使得CLS從0.425下降至0.422。可見主要影響因素還在於表格高度。
<template>
...
<el-table-column label="自己的label" min-width="140">
        <template slot-scope="scope">
          <img
            class="monitor-link"
            :src="excelIcon"
            width="40"
            @click="(e) => handleDownload(scope.row)"
          />
        </template>
      </el-table-column>
</template>
<style lang="scss" scoped>
.monitor-link {
  cursor: pointer;
  aspect-ratio: 40/42;
}

</style>


2. 根據當前頁面佈局,重新設置表格高度。改動後使得CLS從0.422下降至0.041。優化效果顯著。

<template>
  <div class="table-wrap">
   <!-- 使用max-height,而不是height : 為瞭解決增減展示列造成的固定列高度錯位展示問題,方法參考https://github.com/ElemeFE/element/issues/4976-->
    <el-table
      class="fixed-head-table"
      :data="data"
      width="100%"
      :max-height="tableHeight" //設置高度表格 
      header-row-class-name="table-header-row"
    >
    ...
  </el-table>
  </div>
</template>
<script>
export default {
  data() {
    return {
      tableHeight: 0,
      ...
    };
  },
  mounted() {
    this.$nextTick(() => {
      // 後面344一般是根據你上下導航欄、表單等的高度來減掉即可
      this.tableHeight = window.innerHeight - 344;
    })
  },
}
</script>



經過以上優化,兩個累積佈局偏移過大的頁面,達到較好的優化效果。A列表的CLS降至0.041,B詳情頁的CLS降至0.136. 截圖如下:

上線效果

自2023.11.14,將以上性能優化代碼上線後,截止到11.30,查看內部性能監控平臺,可以看到上線15天內,項目A的整體性能評分由之前的59~70分,上升到87分,達到性能體驗良好的效果。

作者:京東零售 李夢爽

來源:京東雲開發者社區 轉載請註明來源


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

-Advertisement-
Play Games
更多相關文章
  • 夜黑風高的某一晚,突然收到一條運營後臺資料庫慢sql的報警,耗時竟然達到了60s。看了一下,還好不是很頻繁,內心會更加從容排查問題,應該是特定條件下沒有走到索引導致,如果頻繁出現慢查詢,可能會將資料庫連接池打滿,導致資料庫不可用,從而導致應用不可用。 ...
  • 最近開始體驗FastGPT開源知識庫問答系統,用他們試著開發調試一些小助手。這中間需要使用到MongoDB,就在自己伺服器上進行了安裝,特此記錄下。 環境說明:阿裡雲ECS,2核8G,X86架構,CentOS 7.9操作系統。 選擇版本 1.打開MongoDB社區版下載頁面,選擇我們想要安裝的版本、 ...
  • 直接加減數字 select sysdate 當前時間, sysdate + 1 加一天, sysdate - 1 減一天, sysdate + (1 / 24) 加一小時, sysdate + (1 / 24 / 60) 加一分鐘 from dual; 使用add_months()函數 select ...
  • 一、垂直分庫場景 場景:在業務系統中,涉及一下表結構,但是由於用戶與訂單每天都會產生大量的數據,單台伺服器的數據存儲以及處理能力是有限的,可以對資料庫表進行拆分,原有資料庫如下 說明1:整個業務系統中的表,大致分為四個,商品信息類的表,訂單相關的表,用戶相關表及省市區相關的表,這裡暫時將省市區的表和 ...
  • 成功之前我們要做應該做的事情,成功之後我們才可以做喜歡做的事情。 1. 處理器架構 CPU 架構是 CPU 廠商給屬於同一系列的 CPU 產品定的一個規範,主要目的是為了區分不同類型 CPU 的重要標示。市面上的 CPU 分類主要分有兩大陣營,一個是 intel、AMD 為首的 複雜指令集 CPU, ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 太長不看 不要嵌套使用函數。給每個函數命名並把他們放在你代碼的頂層 利用函數提升。先使用後聲明。 處理每一個異常 編寫可以復用的函數,並把他們封裝成一個模塊 什麼是“回調地獄”? 非同步Javascript代碼,或者說使用callback的 ...
  • 前言 ECMAScript 2023 引入了一些新功能,以改進語言並使其更加強大和無縫。這個新版本帶來了令人興奮的功能和新的 JavaScript 數組方法,使使用 JavaScript 編程更加愉快和輕鬆。本文將帶領讀者全面瞭解數組原型上新 JavaScript 方法。 什麼是ECMAScript ...
  • pinia 兩種寫法定義pinia 第一種:對象形式 不需要寫ref state直接就是響應式數據 import { defineStore } from "pinia" export const useCounterStore = defineStore("useCounterStore ", { ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...