lighthouse-自定义Gatherer与Audits

news2024/11/24 0:15:04

这篇文章是Lighthouse的后续,之前介绍了
lighthouse的介绍和基本使用方法
Lighthouse组合Puppeteer检测页面
这两篇文章,在这两篇文章中介绍了lighthouse的整体架构和基本运行的逻辑,lighthouse默认也采集了足够丰富的数据供我们去分析页面的性能,正常情况下足够我们在日常开发中使用。如果真的有很特别的业务需求,lighthouse默认的没有采集到的数据,那我们也可按照自己的需求自定义一个Gatherer和Audits来满足我们的需求。
下面我们就自定义几个Gatherer和Audit

自定义Gatherer与Audits - Demo1

收集京东首页渲染出的Img元素有多少个,并获取其src属性值。也可以按需获取其他值,比如该元素有无设置宽高以达到减少重排的目的。或者获取某个异步加载的属性,以此来判断该Img图片是否进行了懒加载。这里简单通用就以元素的src属性为例说明如何自定义Gatherer和Audit

自定义Gatherer

在之前的lighthouse的介绍和基本使用方法中介绍了lighthouse的整体架构,在Gatherer部分,我们需要建立一个文件来实现具体的收集器。在自定义文件中我们需要集成Gatherer并使用提供出来的三个钩子,beforepass、pass、afterpass。关于这三个的区别在lighthouse的介绍和基本使用方法文章中已近结合源码详细的介绍过了,这里就不赘述了。直接上代码
在这里插入图片描述
该文件的名称为image-audit-gatherer.js(这个也很重要,在传入配置给Lighthouse审计的时候需要这个文件名)
在afterpass这个钩子中会传递passContext参数,我们可以使用这个对象上的driver中的evaluateAsync方法来获取当前页面上的Img元素。注意的是这里需要把这个getImgSrcList方法先转为字符串。所以会调用toString()方法
这里说明一下,之前我本想通过document.querySelectorAll(‘Img’)将页面中的Img dom元素获取然后传递进来,但在传递的过程中获取的元素却是空对象,我也没弄明白这里面的详细机制,后来尝试了几次,貌似DOM元素的传递在这里是不行的,如下图所示:
在这里插入图片描述
修改为正确的写法之后,我们可以获取京东首页渲染出的Img元素中的src属性值,如下:
在这里插入图片描述

自定义Audits

上面通过Gatherer收集到了首页渲染出Img标签中src属性值之后,就会传递到自定义Audit之中。由Audit来做进一步的处理。关于Audit中的机制在之前lighthouse的介绍和基本使用方法文章中也结合源码有比较详细的描述,这里就不额外赘述,直接上代码。
在这里插入图片描述
整体的架子,由之前文章所述,子类必须实现静态方法meta和audit。meta是关于该audit的一些描述信息,audit则是审计的详细逻辑。
在gatherer中传递过来的数据都挂载在artifacts.ResourceGatherer上。
这里score(必须在0~1之间的值)就是唯一一个必须返回的对象值,其余的都是可选。这里只是举例子,所以直接给了个0.6,在实际运行时,由具体的业务场景来确定该指标得分的具体方式。details返回的是一个描述tables的数据。Audit.makeTableDetails是Audit上面的一个静态方法。其源码如下:
在这里插入图片描述
其中的heading有下面几个属性
在这里插入图片描述
其中比较重要的在途中也都有标记。其中ItemType的枚举值有如下几种:
在这里插入图片描述
可以根据其类型不同而有不同的效果,比如如果是url的话,在渲染的时候就会有一个a标签包裹,使其有跳转的功能,如果是thumbnail的话就会生成图片。

配置文件

自定义的Gatherer和Audit完成之后,需要在config参数中登记,并作为第三个参数传递给lighthouse方法
在这里插入图片描述该配置文件中需要注意的点都标注在了图片上

检测页面

自定义Gatherer、Audit、config都完成之后,直接引入然后传递给lighthouse方法的第三个参数即可
在这里插入图片描述

效果

运行该文件之后,可以看到整个效果如下:
请添加图片描述
审计的报告会显示一个分数,这里传入的是0.6就会显示是60分。并展示出京东首页渲染出的所有Img元素。因为我们设置的url和图片类型分别为url和thumbnail,所以对应的key虽然一样都是url但最终渲染出来的效果不同,一个是超链接,一个是图片

自定义Gatherer与Audits - Demo2

除了Demo1展示的收集我们自己书写的逻辑之外,我们也可以直接收集浏览器API的各种数据,比如这里期望获取京东首页的各种资源加载,我们可以在自定义gatherer中通过window.performance.getEntries()这个API来获取资源加载的信息,然后把这个数据返回给
Audit即可

自定义Gatherer

在这里插入图片描述

通过这个API获取资源加载的信息之后返回给Audit

自定义Audit

在这里插入图片描述
这里score可以根据具体的业务场景来计算最终得分,这里就直接写成0.9来展示一下

配置文件

在这里插入图片描述

效果

在这里插入图片描述

参考文章

lighthouse的介绍和基本使用方法
Lighthouse组合Puppeteer检测页面
Lighthouse使用说明

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/374170.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

都在用 AI 生成美少女,而我却。。。

最近 AI 画画特别的火,你能从网上看到非常多好看的图片,于是我就开始了我的安装之旅,我看到的图是这样的。这样的。还有这样的。然后我就开始了我的 AI 安装生成计划。安装环境首先我们需要安装 Python 环境,因为这个需要显卡&…

NCRE计算机等级考试Python真题(二)

第二套试题1、关于算法的描述,以下选项中错误的是A.算法具有可行性、确定性、有穷性的基本特征B.算法的复杂度主要包括时间复杂度和数据复杂度C.算法的基本要素包括数据对象的运算和操作及算法的控制结构D.算法是指解题方案的准确而完整的描述正确答案: …

Java基础之日志

2.日志 2.1概述【理解】 概述 程序中的日志可以用来记录程序在运行的时候点点滴滴。并可以进行永久存储。 日志与输出语句的区别 输出语句日志技术取消日志需要修改代码,灵活性比较差不需要修改代码,灵活性比较好输出位置只能是控制台可以将日志信息写…

用于C++的对象关系映射库—YB.ORM

1 介绍YB.ORM YB.ORM 旨在简化与关系数据库交互的 C 应用程序的开发。 对象关系映射器(ORM) 通过将数据库表映射到类并将表行映射到应用程序中的对象来工作,这种方法可能不是对每个数据库应用程序都是最佳的,但它被证明在需要复杂逻辑和事务处理的应用程…

不怕被AirTag跟踪?苹果Find My技术越来越普及

苹果的 AirTag 自推出以来,如何有效遏制用户用其进行非法跟踪,是摆在苹果面前的一大难题。一家为执法部门制造无线扫描设备的公司近日通过 KickStarter 平台,众筹了一款消费级产品,可帮助用户检测周围是否存在追踪的 AirTag 等设备…

Spring中的FactoryBean 和 BeanFactory、BeanPostProcessor 和BeanFactoryPostProcessor解析

文章目录FactoryBean 和 BeanFactory后置处理器BeanPostProcessor 和 BeanFactoryPostProcessorBeanPostProcessorBeanFactoryPostProcessorFactoryBean 和 BeanFactory BeanFactory接⼝是容器的顶级接⼝,定义了容器的⼀些基础⾏为,负责⽣产和管理Bean的…

python元编程详解

什么是元编程 软件开发中很重要的一条原则就是“不要重复自己的工作(Don’t repeat youself)”,也就是说当我们需要复制粘贴代码时候,通常都需要寻找一个更加优雅的解决方案,在python中,这类问题常常会归类…

C++015-C++函数

文章目录C015-C函数函数目标char[]和stringchar[]char*string字符常量与字符串常量字符串的输入题目描述 字符串输出题目描述在线练习:总结C015-C函数 在线练习: http://noi.openjudge.cn/ https://www.luogu.com.cn/ 函数 目标 函数是指一段可以直接被…

SVG实例详解系列(一)(svg概述、位图和矢量图区别(图解)、SVG应用实例)

SVG实例详解系列(一) (svg概述、位图和矢量图区别(图解)、SVG应用实例) 目录 一、什么是SVG? (1)、位图和矢量图概念(图解) (2)、SVG的小例子…

Flutter入门进阶之旅 -开源Flutter项目

开源Flutter项目 该项目为纯flutter端项目,采用aar方式寄生在原生APP中,作为APP中的一个独立模块 在业务逻辑上做到与原生APP完全隔离,Flutter端开发者,可完全不用关注原生端的业务模块 两端开发彼此业务隔离,缩小了对…

数字IC手撕代码--小米科技(除法器设计)

前言: 本专栏旨在记录高频笔面试手撕代码题,以备数字前端秋招,本专栏所有文章提供原理分析、代码及波形,所有代码均经过本人验证。目录如下:1.数字IC手撕代码-分频器(任意偶数分频)2.数字IC手撕…

wondows10系统python2.7兼容安装python3.10

假设已安装好python2.7和pyhon3.10。 python命令只需要应用程序改名即可,需要修改的有python.exe和pythonw.exe pip命令麻烦点,需要用改名后的程序名 重新安装,命令如下: python3 -m pip install --upgrade pip --force-reinst…

说说 Pluma 插件管理框架

1. 概述 Pluma 是一个用 C 开发的可用于管理插件的开源架构,其官网地址为:http://pluma-framework.sourceforge.net/。该架构是个轻量级架构,非常易于理解。 Pluma 架构有以下基本概念: 1)插件的外在行为体现为一个…

【C++的OpenCV】第七课-OpenCV图像常用操作(四):图像形态学-图像侵蚀和扩散的原理

让我们来深化前边学习的内容前言一、图像形态学是什么?二、侵蚀和扩张的原理2.1 图像的侵蚀2.1.1 概念2.1.2 原理解释2.2 图像的扩张2.2.1 概念2.2.2 原理解释相关链接:【C的OpenCV】第六课-OpenCV图像常用操作(三):Op…

RK3568镜像的拆包和打包

文章目录 前言一、window上分包和打包分包打包二、Linux上分包和打包分包打包总结前言 本文记录在win10上利用瑞芯微提供的工具进行分包和打包,同样也有Linux教程 提示:以下是本篇文章正文内容,下面案例可供参考 一、window上分包和打包 分包 window下一般直接利用工具即…

【正点原子FPGA连载】 第十八章基于BRAM的PS和PL的数据交互 摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南

1)实验平台:正点原子MPSoC开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id692450874670 3)全套实验源码手册视频下载地址: http://www.openedv.com/thread-340252-1-1.html 第十八章基于BRA…

在 Flutter 中使用 webview_flutter 4.0 | 基础用法与事件处理

大家好,我是 17。 Flutter WebView 一共写了四篇文章 在 Flutter 中使用 webview_flutter 4.0 | 基础用法与事件处理在 Flutter 中使用 webview_flutter 4.0 | js 交互Flutter WebView 性能优化,让 h5 像原生页面一样优秀,已入选 掘金一周 …

AI绘画进军三次元,有人用它打造赛博女友?(diffusion)

目录0 写在前面1 AI绘画技术飞跃2 效果展示3 环境配置3.1 下载基础模型3.2 更新.NET和模型3.3 下载绘画模型3.4 启动项目3.5 标签配置4 结语0 写在前面 机器学习强基计划聚焦深度和广度,加深对机器学习模型的理解与应用。“深”在详细推导算法模型背后的数学原理&a…

内存数据库-4-[redis]在ubuntu中离线安装

Ubuntu20.04(linux)离线安装redis 官网redis下载地址 下载安装包redis-6.0.9.tar.gz。 1 下载安装 (1)解压 sudo tar -xzvf redis-6.0.9.tar.gz -C /usr/local/ cd /usr/local/redis-6.0.9/(2)编译 sudo make(3)测试 sudo dpkg -i libtcl8.6_8.6.10dfsg-1_amd64.deb sudo d…

纯x86汇编实现的多线程操作系统实践 - 第七章 AP2的用户进程

AP2用户进程的代码为task2.asm。该用户进程将在界面上显示一个移动的弹球。一旦在界面上点击鼠标左键,弹球就会直接从鼠标点击处重新出现并继续移动。如何在界面上显示出一个持续移动的小球?计算小球将移动到的区域1->保留该区域中将被小球覆盖的点-&…