首页 > 其他分享 >如何利用烛龙和谷歌插件优化CLS(累积布局偏移) | 京东云技术团队

如何利用烛龙和谷歌插件优化CLS(累积布局偏移) | 京东云技术团队

时间:2023-12-18 12:07:30浏览次数:34  
标签:插件 烛龙 布局 偏移 尺寸 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按钮即可触发检测,为保证整体性能偏向真实场景,推荐大家在检测中进行一些当前页面的常规操作)

如何利用烛龙和谷歌插件优化CLS(累积布局偏移) | 京东云技术团队_异步加载

性能截图分别如下:

  1. A列表

如何利用烛龙和谷歌插件优化CLS(累积布局偏移) | 京东云技术团队_前端_02

2\. B详情页

如何利用烛龙和谷歌插件优化CLS(累积布局偏移) | 京东云技术团队_前端_03

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. 截图如下:

如何利用烛龙和谷歌插件优化CLS(累积布局偏移) | 京东云技术团队_异步加载_04

如何利用烛龙和谷歌插件优化CLS(累积布局偏移) | 京东云技术团队_github_05

上线效果

自2023.11.14,将以上性能优化代码上线后,截止到11.30,查看内部性能监控平台,可以看到上线15天内,项目A的整体性能评分由之前的59~70分,上升到87分,达到性能体验良好的效果。

作者:京东零售 李梦爽

来源:京东云开发者社区 转载请注明来源

标签:插件,烛龙,布局,偏移,尺寸,CLS,性能,页面
From: https://blog.51cto.com/u_15714439/8870877

相关文章

  • Eclipse在线安装SVN插件
    环境:Win10、eclipse2013-12(javaversion"1.8.0_221")先下载jdk安装完成,并配置好环境变量,因为eclipse启动需要依赖jdk环境。eclipse无需安装,解压使用,进入解压目录,双击eclipse.exe执行即可。电脑可以联网,按照以下步骤在线安装svn资源管理器。这一步可以先点击Installed,确保当前没......
  • Linux服务器快速安装PostgreSQL15以及pgvector向量插件
    最近开始体验FastGPT或Dify等开源知识库问答系统,用他们试着开发调试一些小助手。这中间需要使用到PostgreSQL,就在自己服务器上进行了安装,特此记录下。环境说明:阿里云ECS,2核8G,X86架构,CentOS7.9操作系统。选择版本1.打开PostgreSQL官网下载页面,选择操作系统和数据库版本。我本......
  • Linux服务器快速安装PostgreSQL15以及pgvector向量插件
    最近开始体验FastGPT或Dify等开源知识库问答系统,用他们试着开发调试一些小助手。这中间需要使用到PostgreSQL,就在自己服务器上进行了安装,特此记录下。环境说明:阿里云ECS,2核8G,X86架构,CentOS7.9操作系统。选择版本1.打开PostgreSQL官网下载页面,选择操作系统和数据库版本。我本机......
  • MySQL 8 社区版安装Percona的审计插件
    1.下载插件#tar-xvfPercona-Server-8.0.32-24-Linux.x86_64.glibc2.17-minimal.tar.gz#cdPercona-Server-8.0.32-24-Linux.x86_64.glibc2.17-minimal/lib/plugin#cpaudit_log.so/usr/local/mysql/lib/plugin/ 2.查看插件位置root@localhost(none)>showvariab......
  • 记一个坑爹的报错,不要过于信任IDE上的热部署插件
    近期处理一个老项目的安全漏洞,要求敏感数据不能明文传输,考虑到效率和兼容性等问题,决定使用对称加密,前端使用CryptoJS,后端使用Java标准库提供的API;最开始试了DES算法,可以调通,但是鉴于现在这个算法因为秘钥太短已经不安全,又尝试新的AES,但是怎么也不行,后台解密报错:java......
  • ffmpeg 添加自定义编解码插件
    有两种方法:一.ffmpeg添加自定义编解码插件(以修改ffmpeg源码的方式添加)例:添加一个解码器,给这个解码器取个名字叫mydecoder,可以通过下面的步骤添加:1.在libavcodec目录下,新建文件mydecoder.c#include"avcodec.h"#include"codec_internal.h"//自己封装的编解码器的头文件#......
  • decimal插件计算
    import{Decimal}from'decimal.js';//引入exportconstcal={jia(num1,num2){returnnewDecimal(num1).add(newDecimal(num2))},jian(num1,num2){returnnewDecimal(num1).sub(newDecimal(num2))},cheng(num1,num2){returnnewDecimal(num......
  • 3.草图大师安装胚子插件、布料模拟插件
    一、胚子插件导入1.下载及安装胚子插件,https://www.bilibili.com/video/BV1xP411s7su/?vd_source=d1a768a1747fb268e1e40d209416a9d02.在草图大师界面右键勾选 二、布料模拟插件导入1.72版ClothWorks只支持su2020(ruby2.5)及以下,su2021(ruby2.7)控制台,使用1.74版ClothWorks,su2......
  • 12月14日插件的具体使用
    配置好环境之后你就可以选择使用mapper或者service了 调用和mapper基本相同但是提供的调用方法更多了。然后你就能够更方便的开始后端开发了。今天的另一件事是逻辑视图建模这是一个针对于外卖管理系统的逻辑视图建模。(一),分析系统用例,确定对象类外卖管理系统包括”商家......
  • 卸载Postman?这款IDEA插件真可以!
    Postman是大家最常用的API调试工具,那么有没有一种方法可以不用手动写入接口到Postman,即可进行接口调试操作?今天给大家推荐一款IDEA插件:ApipostHelper,写完代码就可以调试接口并一键生成接口文档!而且还可以根据已有的方法帮助您快速生成url和params。更重要的是他完全免费!Apipost......