当前位置: 首页 > news >正文

lighthouse的介绍和基本使用方法

Lighthouse简介

Lighthouse是一个开源的自动化性能测试工具,我们可以使用该功能检测我们的页面存在那些性能方面的问题,并会生成一个详细的性能报告来帮助我们来优化页面

使用方式

LH一共有四种使用方式

  • Chrome开发者工具
  • Chrome扩展
  • Node 命令行
  • Node module

前两种方式是在用户浏览器端直接运行,以开发者工具为例,我们打开控制台,可以看到有一个Lighthouse的选项,点击之后,就可以直接检测当前页面的性能了。
在这里插入图片描述
这里有几个选项,一个是模式,一般我们选择默认模式即可。一个是设备,可以模拟移动端设备或者桌面设备还有一个是检测的类别。确定选项之后点击分析网页加载情况即可开始对当前页面进行性能分析。以京东的首页为例经过一段时间的检测后会生成如下的报告
在这里插入图片描述
我们可以看到报告中会审计各种各样的指标,其中时间维度比较重要的就是下面6个指标:

  • SI
  • FCP
  • TTI
  • TBT
  • LCP
  • CLS

在此之后还有一些优化的建议,比如图片的预加载,移除阻塞渲染的资源,和减少未使用的js加载等等…

后两种模式,我们可以将lighthouse运行在自己的服务上,这样结合一些自动化的手段,就无需用户自己在浏览器端主动进行检测了,而是可以在需要的时候(比如开发的页面上线前在测试阶段)可以主动在我们的服务中对该页面进行性能的检测,确保我们上线的页面会有一个比较好的性能表现,下面会重点以Node module的方式来介绍使用

整体架构

我们看github上官方文档对lighthouse的整体架构设计有这么一张图:
在这里插入图片描述

Puppeteer & Chrome

由上图左下侧我们可以看到,lighthouse是通过Driver模块和Puppeteer(一个 Node 库,它提供了一个高级 API 来通过 DevTools 协议控制 Chromium 或 Chrome)来控制浏览器,我们可以通过Puppeteer来模拟用户对浏览器的各种操作,比如点击元素,滚动页面,键盘操作。一个常见的场景就是我们自己的产品使用lighthouse进行检测的时候,往往需要用户先登录,此时我们就可以使用Puppeteer来帮助我们先模拟用户登录,登录之后,利用Cookie的同源策略再次检测我们的页面就可以了。

Gatherers

顾名思义如翻译之后的意思,这是一个收集器。需要在配置文件中定义需要运行的Gatherer,每一个Gatherer都有一个在配置文件中同名的文件来实现收集器的功能。以达到在审计一个页面的时候需要收集这个页面的各种指标数据,收集这些指标数据就是Gatherers模块完成的。比如在lighthouse内置收集器中有这些文件都是gatherer。
这些gatherer都需要继承一个标准的Gather来实现功能,在后面我们演示自定义Gatherer时也需要继承这个基类
在这里插入图片描述

beforepass、pass、afterpass

在这个里面有个很重要的概念就是pass,包含三个阶段即:beforepass、pass、afterpass。来控制页面是如何加载,以及在加载过程中采集那些数据。
关于beforepass、pass、afterpass这三个的区别从名称上也能看出,一个导航到目标页面之前,一个是目标页面加载之后,一个是目标页面加载后并且所有的pass都执行完之后。我们可以直接看lighthouse源码部分
在这里插入图片描述

Audits

我们从架构图中可以看到,Gathering模块运行之后会生成一个artifacts,其实就是一些采集的数据,这些数据进行一些列的计算之后再传递给Audits,由Audits来对这些数据进行进一步的审计,计算出每一项的具体得分,为生成的报告提供数据。
与gatherers类似,在配置文件中也会定义需要运行的audit。每一个audit也都有一个与之对应的同名文件来实现具体的审计功能。
每个audit都会实现一个静态的meta()方法和一个静态的audit()方法。如果没有实现这两个方法的话就会抛错哦
在这里插入图片描述

Lighthouse Audit源码

meta

Audits中的meta是对当前Audit的一些描述。一共有如下一些字段
在这里插入图片描述
其中比较重要的一个是ID,这个需要和传入的配置中的auditRefs数组中的ID相对应,否则找不到。另一个就是requiredArtifacts这是一个数组,表示该Audit需要哪些gatherer模块

audit

lighthouse中的audit函数如下:

/**** @param {LH.Artifacts} artifacts* @param {LH.Audit.Context} context* @return {LH.Audit.Product|Promise<LH.Audit.Product>}*/static audit(artifacts, context) {throw new Error('audit() method must be overriden');}

这个函数接受两个参数一个是制品,即gatherer采集的那些数据,挂在artifacts.ResourceGatherer属性中,以及context当前的上下文。
我们一般会在audit中由传递过来采集的数据和该指标的权重来计算出该项指标具体的得分,最终会返回一个对象。我们可以看一下源码中的定义,看看返回对象的数据形状是什么样的。
首先是audit函数说明上,会return 一个LH.Audit.Product的东西。我们可以点击去看看这是个啥。
在这里插入图片描述
在这里插入图片描述
源码部分:

  /** The shared properties of an Audit.Product whether it has a numericValue or not. We want to enforce `numericUnit` accompanying `numericValue` whenever it is set, so the final Audit.Product type is a discriminated union on `'numericValue' in audit`*/interface ProductBase {/** The scored value of the audit, provided in the range `0-1`, or null if `scoreDisplayMode` indicates not scored. */score: number | null;/** The i18n'd string value that the audit wishes to display for its results. This value is not necessarily the string version of the `numericValue`. */displayValue?: string | IcuMessage;/** An explanation of why the audit failed on the test page. */explanation?: string | IcuMessage;/** Error message from any exception thrown while running this audit. */errorMessage?: string | IcuMessage;warnings?: Array<string | IcuMessage>;/** Overrides scoreDisplayMode with notApplicable if set to true */notApplicable?: boolean;/** Extra information about the page provided by some types of audits, in one of several possible forms that can be rendered in the HTML report. */details?: AuditDetails;/** If an audit encounters unusual execution circumstances, strings can be put in this optional array to add top-level warnings to the LHR. */runWarnings?: Array<IcuMessage>;}/** The Audit.Product type for audits that do not return a `numericValue`. */interface NonNumericProduct extends ProductBase {numericValue?: never;}/** The Audit.Product type for audits that do return a `numericValue`. */interface NumericProduct extends ProductBase {/** A numeric value that has a meaning specific to the audit, e.g. the number of nodes in the DOM or the timestamp of a specific load event. More information can be found in the audit details, if present. */numericValue: number;/** The unit of `numericValue`, used when the consumer wishes to convert numericValue to a display string. A superset of https://tc39.es/proposal-unified-intl-numberformat/section6/locales-currencies-tz_proposed_out.html#sec-issanctionedsimpleunitidentifier */numericUnit: 'byte'|'millisecond'|'element'|'unitless';}/** Type returned by Audit.audit(). Only score is required.  */type Product = NonNumericProduct | NumericProduct;

具体的字段名称的含义可以看上面的说明,吐槽一下,lighthouse的使用文档写的真是一般,但代码中的注释写的倒是还阔以。
Audit函数字段说明

Lighthouse Report

由架构图我们可以看到,由Audits审计之后会生成一个LHR.json的文件,这个文件就是最终的数据报告了。然后会基于此由report模块来对这些数据进行渲染生成一个html文件

使用方式

官网的demo

整体代码如下:

/*** 官网示例* https://github.com/GoogleChrome/lighthouse/blob/main/docs/readme.md#using-programmatically**/
import fs from 'fs'
import lighthouse from 'lighthouse'
import chromeLauncher from 'chrome-launcher'
// https://github.com/GoogleChrome/lighthouse/discussions/12058
import desktopConfig from 'lighthouse/lighthouse-core/config/desktop-config.js'// const chrome = await chromeLauncher.launch({ chromeFlags: ['--headless'] })
const chrome = await chromeLauncher.launch()
const options = { logLevel: 'info', output: 'html', onlyCategories: ['performance'], port: chrome.port }
const runnerResult = await lighthouse('https://www.jd.com/', options, desktopConfig)// `.report` is the HTML report as a string
const reportHtml = runnerResult.report
fs.writeFileSync('lhreport.html', reportHtml)// `.lhr` is the Lighthouse Result as a JS object
console.log('Report is done for', runnerResult.lhr.finalDisplayedUrl)
console.log('Performance score was', runnerResult.lhr.categories.performance.score * 100)await chrome.kill()

在运行的时候,我们可以将{ chromeFlags: [‘–headless’] }参数去除,不使用无头模式,这样我们可以观察整个程序的执行流程。这里也稍作修改一下,在Node module中默认是移动端模式,我们这里修改成PC端模式,需要对lighthouse传入第三个参数。第三个参数就是模拟的PC端的桌面模式。这里还是以京东首页为例子。效果如下:
在这里插入图片描述
在项目中会生成一个lhreport.html报告文件

官网的demo是比较简单的,但实际我们在应用的时候,场景会比较复杂,比如我们大多数的产品都需要登录,如果不登录就没法访问页面,那就没法检测了。后面会接着分享,如果使用puppeteer+lighthouse来解决这个场景以及自定义gatherers 和audits。

参考资料

  • lighthouse 架构图
  • SI指标说明
  • FCP指标说明
  • TTI指标说明
  • TBT指标说明
  • LCP指标说明
  • CLS指标说明
  • Puppeteer 中文文档
  • Gather部分源码
  • Lighthouse Audit源码
  • Audit函数字段说明
  • Node module使用

相关文章:

lighthouse的介绍和基本使用方法

Lighthouse简介 Lighthouse是一个开源的自动化性能测试工具&#xff0c;我们可以使用该功能检测我们的页面存在那些性能方面的问题&#xff0c;并会生成一个详细的性能报告来帮助我们来优化页面 使用方式 LH一共有四种使用方式 Chrome开发者工具Chrome扩展Node 命令行Node …...

分布式算法 - Raft算法

Paxos是出了名的难懂&#xff0c;而Raft正是为了探索一种更易于理解的一致性算法而产生的。它的首要设计目的就是易于理解&#xff0c;所以在选主的冲突处理等方式上它都选择了非常简单明了的解决方案。推荐阅读提示强烈推荐通过如下资料学习raft。 raft.github.io这里面有一个…...

Python|每日一练|链表|双指针|数组|递归|图算法|单选记录:删除链表的倒数第 N 个结点|下一个排列|迷宫问题

1、删除链表的倒数第 N 个结点&#xff08;链表&#xff0c;双指针&#xff09; 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 进阶&#xff1a;你能尝试使用一趟扫描实现吗&#xff1f; 示例 1&#xff1a; 输入&#xff1a;head …...

天线理论知识2——宽带天线介绍

系列文章目录 文章目录 系列文章目录前言一、行波天线1. 长导线天线2. V形天线二、螺旋天线三、八木-宇田天线前言 宽带天线指的是具有哦宽频带特性的天线,常见的宽带天线有行波天线,螺旋天线以及八木天线。 一、行波天线 长度为 l l l的中心馈电的线天线上的电流呈驻波分…...

【计组笔记05】计算机组成与原理之虚拟存储器、指令系统、中央处理器CPU

这篇文章,主要介绍计算机组成与原理之虚拟存储器、指令系统、中央处理器CPU。 目录 一、虚拟存储器 1.1、页式虚拟存储器 1.2、段式虚拟存储器 1...

多功能土壤速测仪功能介绍

大家好&#xff0c;今天给大家介绍一款多功能土壤速测仪&#xff0c;它由多功能速测仪主机、土壤墒情传感器、USB数据线、电源适配器、便携式手提箱等部分组成。速测主机配备有工业级液晶屏&#xff0c;大屏幕中文显示&#xff0c;使得测量参数&#xff0c;时间&#xff0c;设备…...

《设计模式》命令模式

《设计模式》命令模式 命令模式&#xff08;Command Pattern&#xff09;是一种行为型设计模式&#xff0c;它将请求和处理分开&#xff0c;使得请求发送者和接收者解耦&#xff0c;从而降低系统的耦合度。在命令模式中&#xff0c;请求被封装为一个独立的对象&#xff0c;并且…...

开源物联网平台有哪些?

目前市面上有许多开源物联网平台可供选择。以下是其中一些较为流行和知名的平台&#xff1a; Eclipse IoT&#xff1a;Eclipse IoT 是一个开源的物联网平台&#xff0c;旨在提供可扩展、灵活和高度集成的工具和框架&#xff0c;用于构建、部署和管理 IoT 解决方案。它包含多个…...

Tesla Autopilot,处理器和硬件

作者 | 初光 出品 | 车端 备注 | 转载请阅读文中版权声明 知圈 | 进“汽车电子与AutoSAR开发”群&#xff0c;请加微“cloud2sunshine” 总目录链接>> AutoSAR入门和实战系列总目录 Tesla MOdelS/X 中有 60 多个处理器。其他型号的处理器较少&#xff0c;但数量仍然不少…...

jianzhiOffer第二版难重点记录

04. 二维数组中的查找https://leetcode.cn/problems/er-wei-shu-zu-zhong-de-cha-zhao-lcof/ 思路&#xff1a;可以每层用以恶搞二分查找&#xff0c;优化思路&#xff1a;从左下角出发直接用二分。 ​​​​​​07. 重建二叉树https://leetcode.cn/problems/zhong-jian-er-cha…...

C语言 | 问题20230225

C语言 | 问题20230225 文章目录C语言 | 问题202302251.问题1无限循环2.问题2C 中的运算符优先级实例1&#xff1a;1.问题1 Which slice of the following code is NOT endless loop? 以下代码的哪一部分不是无限循环&#xff1f; A for (;(cgetchar())!\n; ) printf("*c&…...

【机器学习笔记】Python基础笔记

目录基础语法加载数据&#xff1a;pd.read_csv查看数据大小&#xff1a;shape浏览数据行字段&#xff1a;columns浏览少量数据&#xff1a;head()浏览数据概要&#xff1a;describe()基础功能语法缺省值去除缺失值&#xff1a;dropna按行删除&#xff1a;存在空值&#xff0c;即…...

js-DOM03-DOM对CSS的操作

DOM对CSS的操作 - 读取和修改内联样式 - 使用style属性来操作元素的内联样式 - 读取内联样式&#xff1a; 语法&#xff1a;元素.style.样式名 - 例子&#xff1a; 元素.style.width 元素.style.…...

tun驱动之tun_init

tun驱动的初始化方法是tun_init。 static int __init tun_init(void) {int ret 0;pr_info("%s, %s\n", DRV_DESCRIPTION, DRV_VERSION);ret rtnl_link_register(&tun_link_ops);if (ret) {pr_err("Cant register link_ops\n");goto err_linkops;}re…...

模拟退火算法优化bp

%% 基于模拟退火遗传算法优化BP神经网络的钢带厚度预测 clear clc close all format short %% 加载训练数据 Xtrxlsread(train_data.xlsx); DDsize(Xtr,2); input_trainXtr(:,1:DD-1);% output_trainXtr(:,DD);% %% 加载测试数据 Xtexlsread(test_data.xlsx); input_testXte(…...

【NFC音乐相册】简易制作

欢迎来到 Claffic 的博客 &#x1f49e;&#x1f49e;&#x1f49e; 前言&#xff1a; NFC音乐相册在前段时间火了一把&#xff0c;想必大家都听过了&#xff0c;最近我刷到了这个东西&#xff0c;闲来无事就弄了几个&#xff0c;这篇博客就记录下制作工序。 注&#xff1a;我所…...

每日一题——L1-085 试试手气(15)

L1-085 试试手气 我们知道一个骰子有 6 个面&#xff0c;分别刻了 1 到 6 个点。下面给你 6 个骰子的初始状态&#xff0c;即它们朝上一面的点数&#xff0c;让你一把抓起摇出另一套结果。假设你摇骰子的手段特别精妙&#xff0c;每次摇出的结果都满足以下两个条件&#xff1a;…...

FreeRTOS信号量

前面介绍过&#xff0c;队列&#xff08;queue&#xff09;可以用于传输数据&#xff1a;在任务之间&#xff0c;任务和中断之间。消息队列用于传输多个数据&#xff0c;但是有时候我们只需要传递一个状态&#xff0c;这个状态值需要用一个数值表示&#xff0c;比如&#xff1a…...

Leetcode.2385 感染二叉树需要的总时间

题目链接 Leetcode.2385 感染二叉树需要的总时间 Rating &#xff1a; 1711 题目描述 给你一棵二叉树的根节点 root&#xff0c;二叉树中节点的值 互不相同 。另给你一个整数 start。在第 0分钟&#xff0c;感染 将会从值为 start的节点开始爆发。 每分钟&#xff0c;如果节点…...

[蓝桥杯 2022 国 B] 卡牌(贪心/二分)

题目传送门 该题第一思路是想去模拟题目中所描述的过程 这里我选择从大到小遍历可能凑出的牌套数&#xff0c;计算凑出它需要补的牌数以及判断是否会超出能补的牌数 #include<iostream> #include<climits> #include<vector> #include<algorithm> #def…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

【位运算】消失的两个数字(hard)

消失的两个数字&#xff08;hard&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;Java 算法代码&#xff1a;更简便代码 题⽬链接&#xff1a;⾯试题 17.19. 消失的两个数字 题⽬描述&#xff1a; 给定⼀个数组&#xff0c;包含从 1 到 N 所有…...

HTML 列表、表格、表单

1 列表标签 作用&#xff1a;布局内容排列整齐的区域 列表分类&#xff1a;无序列表、有序列表、定义列表。 例如&#xff1a; 1.1 无序列表 标签&#xff1a;ul 嵌套 li&#xff0c;ul是无序列表&#xff0c;li是列表条目。 注意事项&#xff1a; ul 标签里面只能包裹 li…...

Java多线程实现之Callable接口深度解析

Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

React19源码系列之 事件插件系统

事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度

文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...