当前位置:首页 > 科技  > 软件

如何有效监测网页静态资源大小?

来源: 责编: 时间:2024-04-24 17:35:34 303观看
导读前言作为前端人员肯定经常遇到这样的场景:需求刚上线,产品拿着手机来找你,为什么页面打开这么慢呀,心想自己开发的时候也有注意性能问题呀,不可能会这么夸张。那没办法只能排查下是哪一块影响了页面的整体性能,打开浏览器控

前言

作为前端人员肯定经常遇到这样的场景:需求刚上线,产品拿着手机来找你,为什么页面打开这么慢呀,心想自己开发的时候也有注意性能问题呀,不可能会这么夸张。那没办法只能排查下是哪一块影响了页面的整体性能,打开浏览器控制台一看,页面上的这些配图每张都非常大,心想这些配图都这么大,页面怎么快,那么我们有没有办法监测页面上的这些静态资源大小,从而避免这种情况的发生。cCG28资讯网——每日最新资讯28at.com

Performance

Performance 接口可以获取到当前页面中与性能相关的信息。cCG28资讯网——每日最新资讯28at.com

该对象提供许多属性及方法可以用来测量页面性能,这里介绍几个用来获取PerformanceEntry的方法:cCG28资讯网——每日最新资讯28at.com

getEntries

该方法获取一组当前页面已经加载的资源PerformanceEntry对象。接收一个可选的参数options进行过滤,options支持的属性有name,entryType,initiatorType。cCG28资讯网——每日最新资讯28at.com

const entries = window.performance.getEntries();

getEntriesByName

该方法返回一个给定名称和 name 和 type 属性的PerformanceEntry对象数组,name的取值对应到资源数据中的name字段,type取值对应到资源数据中的entryType字段。cCG28资讯网——每日最新资讯28at.com

const entries = window.performance.getEntriesByName(name, type);

getEntriesByType

该方法返回当前存在于给定类型的性能时间线中的对象PerformanceEntry对象数组。type取值对应到资源数据中的entryType字段。cCG28资讯网——每日最新资讯28at.com

const entries = window.performance.getEntriesByType(type);

尝试获取静态资源数据

使用getEntriesByType获取指定类型的性能数据,performance entryType中有一个值为resource,用来获取文档中资源的计时信息。该类型包括有:script、link、img、css、xmlhttprequest、beacon、fetch、other等。cCG28资讯网——每日最新资讯28at.com

const resource = performance.getEntriesByType('resource')console.log('resource', resource)

这样可以获取到非常多关于资源加载的数据:cCG28资讯网——每日最新资讯28at.com

cCG28资讯网——每日最新资讯28at.com

为了方便查看,我们来稍微处理下数据cCG28资讯网——每日最新资讯28at.com

const resourceList = []const resource = performance.getEntriesByType('resource')console.log('resource', resource)resource.forEach((item) => {  resourceList.push({    type: item.initiatorType, // 资源类型    name: item.name, // 资源名称    loadTime: `${(item.duration / 1000).toFixed(3)}s`, // 资源加载时间    size: `${(item.transferSize / 1024).toFixed(0)}kb`, // 资源大小  })})

cCG28资讯网——每日最新资讯28at.com

这样对于每个资源的类型、名称、加载时长以及大小,都非常清晰cCG28资讯网——每日最新资讯28at.com

但是有些资源的大小为什么会是0呢?以及还有很多页面上的资源貌似没有统计到,这是为啥呢?cCG28资讯网——每日最新资讯28at.com

这是因为页面上的资源请求并不是一次性加载完的,比如一些资源的懒加载,这里就有可能会统计不到,或者资源大小统计会有问题,所以我们需要监听资源的动态加载。cCG28资讯网——每日最新资讯28at.com

监听资源加载

以上介绍的3个API都无法做到对资源动态加载的监听,这里就需要用到PerformanceObserver来处理动态加载的资源了cCG28资讯网——每日最新资讯28at.com

PerformanceObserver

PerformanceObserver 主要用于监测性能度量事件,在浏览器的性能时间轴记录新的 performanceEntry 时会被通知。cCG28资讯网——每日最新资讯28at.com

通过使用 PerformanceObserver() 构造函数我们可以创建并返回一个新的 PerformanceObserver 对象,从而进行性能的监测。cCG28资讯网——每日最新资讯28at.com

用法

PerformanceObserver 与其它几个 Observer 类似,使用前需要先进行实例化,然后使用 observe 监听相应的事件。cCG28资讯网——每日最新资讯28at.com

function perf_observer(list, observer) {  // ...}var observer = new PerformanceObserver(perf_observer);observer.observe({ entryTypes: ["resource"] });

它主要有以下实例方法:cCG28资讯网——每日最新资讯28at.com

  • observe:指定监测的 entry types的集合。当 performance entry 被记录并且是指定的 entryTypes 之一的时候,性能观察者对象的回调函数会被调用。
  • disconnect:性能监测回调停止接收PerformanceEntry。
  • takeRecords:返回当前存储在性能观察器的 performance entry列表,并将其清空。

尝试获取页面图片加载信息

new PerformanceObserver((list) => {  list    .getEntries()    .filter(    (entry) =>    entry.initiatorType === 'img' || entry.initiatorType === 'css',  )    .forEach((entry) => {    resourceList.push({      name: entry.name, // 资源名称      loadTime: `${(entry.duration / 1000).toFixed(3)}s`, // 资源加载时间      type: entry.initiatorType, // 资源类型      size: `${(entry.transferSize / 1024).toFixed(0)}kb`, // 资源大小    })    console.log('--', resourceList)  })}).observe({ entryTypes: ['resource'] })

这里需要注意的是,获取类型除了img还得加上css,因为CSS中可能会有通过url()加载的背景图。cCG28资讯网——每日最新资讯28at.com

cCG28资讯网——每日最新资讯28at.com

这样,页面上的图片大小以及加载时长一目了然了cCG28资讯网——每日最新资讯28at.com

通知

我们自己是知道问题了,但是还需要将这些信息推送给产品及运营,这个可以通过企业微信提供的API来进行操作,不满足条件的资源将进行推送通知:cCG28资讯网——每日最新资讯28at.com

setTimeout(() => {  axios.get('http://127.0.0.1:3000/jjapi/user/pushMessage', {    params: {      msgtype: 'markdown',      markdown: {        content: `          <font color="warning">H5项目资源加载异常,请注意查看</font>          类型:<font color="comment">图片资源大小超出限制</font>          异常数量:<font color="comment">${resourceList.length}例</font>           异常列表:<font color="comment">${resourceList.map(            (item) => item.name,          )}</font>`,      },    },  })}, 8000)

通知如下:cCG28资讯网——每日最新资讯28at.com

cCG28资讯网——每日最新资讯28at.com

这里为了避免跨域,使用nest自己包了一层,这样就能够及时发现线上配置资源是否有问题,并且这个脚本也不需要所有用户都执行,因为大家的资源都是一样的,只需要配置特定白名单(比如开发、测试、产品),在页面上线后,在进行线上回归的同时执行该脚本去监测上线配置资源是否都合理...cCG28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-85234-0.html如何有效监测网页静态资源大小?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 过多的全局变量带来的弊端与解决之道

下一篇: 效率工具:Readwise Reader和Arc浏览器新功能介绍

标签:
  • 热门焦点
  • 0糖0卡0脂 旭日森林仙草乌龙茶优惠:15瓶到手29元

    旭日森林无糖仙草乌龙茶510ml*15瓶平时要卖为79.9元,今日下单领取50元优惠券,到手价为29.9元。产品规格:0糖0卡0脂,添加草本仙草汁,清凉爽口,富含茶多酚,保留
  • 2023 年的 Node.js 生态系统

    随着技术的不断演进和创新,Node.js 在 2023 年达到了一个新的高度。Node.js 拥有一个庞大的生态系统,可以帮助开发人员更快地实现复杂的应用。本文就来看看 Node.js 最新的生
  • 让我们一起聊聊文件的操作

    文件【1】文件是什么?文件是保存数据的地方,是数据源的一种,比如大家经常使用的word文档、txt文件、excel文件、jpg文件...都是文件。文件最主要的作用就是保存数据,它既可以保
  • 三言两语说透柯里化和反柯里化

    JavaScript中的柯里化(Currying)和反柯里化(Uncurrying)是两种很有用的技术,可以帮助我们写出更加优雅、泛用的函数。本文将首先介绍柯里化和反柯里化的概念、实现原理和应用
  • 多线程开发带来的问题与解决方法

    使用多线程主要会带来以下几个问题:(一)线程安全问题  线程安全问题指的是在某一线程从开始访问到结束访问某一数据期间,该数据被其他的线程所修改,那么对于当前线程而言,该线程
  • 使用LLM插件从命令行访问Llama 2

    最近的一个大新闻是Meta AI推出了新的开源授权的大型语言模型Llama 2。这是一项非常重要的进展:Llama 2可免费用于研究和商业用途。(几小时前,swyy发现它已从LLaMA 2更名为Lla
  • 微博大门常打开,迎接海外画师漂洋东渡

    作者:互联网那些事&ldquo;起猛了,我能看得懂日语了&rdquo;。&ldquo;为什么日本人说话我能听懂?&rdquo;&ldquo;中文不像中文,日语不像日语,但是我竟然看懂了&rdquo;&hellip;&hell
  • 联想小新Pad Pro 12.6将要推出,搭载高通骁龙 870 处理器

    联想小新Pad Pro 12.6将于秋季新品会上推出,官方按照惯例直接在发布会前给出了机型的所有参数。联想小新 Pad Pro 12.6 将搭载高通骁龙 870 处理器,重量为 5
  • 最薄的14英寸游戏笔记本电脑 Alienware X14已可以购买

    2022年1月份在国际消费电子展(CES2022)上首次亮相的Alienware新品——Alienware X14现在已经可以购买了,这款笔记本电脑被誉为世界上最薄的 14 英寸游戏笔
Top