首页 > 其他分享 >页面性能计算

页面性能计算

时间:2024-05-30 16:10:53浏览次数:21  
标签:&& const 计算 observer 性能 item startTime entry 页面

计算 LargestContentPaint

 1 function observeLargestConentPaint(){
 2   if (!utils.canIUse('PerformanceObserver')) return;
 3   new PerformanceObserver((entryList) => {
 4     for (const entry of entryList.getEntries()) {
 5       const largestConentPaint = entry.startTime
 6       setPageInfo(pageId, {
 7         largestConentPaint
 8       })
 9     }
10   }).observe({ type: 'largest-contentful-paint', buffered: true });
11 }

 

计算首屏渲染时间

监听首屏dom渲染时机

 1 /**
 2  * 计算首屏渲染时间
 3  */
 4 entries = [];
 5 function observeFirstScreen(params) {
 6   if (!utils.canIUse('MutationObserver')) return;
 7   const next = window.requestAnimationFrame ? requestAnimationFrame : setTimeout
 8   const ignoreDOMList = ['STYLE', 'SCRIPT', 'LINK']
 9   const viewportWidth = window.innerWidth
10   const viewportHeight = window.innerHeight
11   // dom 对象是否在屏幕内
12   function isInScreen(dom) {
13     const rectInfo = dom.getBoundingClientRect()
14     if (rectInfo.left < viewportWidth && rectInfo.top < viewportHeight) {
15       return true
16     }
17 
18     return false
19   }
20   const observer = new MutationObserver(mutationList => {
21     const next = window.requestAnimationFrame ? requestAnimationFrame : setTimeout
22     const entry = {
23       children: [],
24     }
25     for (const mutation of mutationList) {
26       if (mutation.addedNodes.length && isInScreen(mutation.target)) {
27         console.log(mutation)
28         entry.children.push(mutation.target)
29         // ...
30       }
31     }
32 
33     if (entry.children.length) {
34       entries.push(entry)
35       next(() => {
36         entry.startTime = performance.now()
37       })
38     }
39   })
40 
41   observer.observe(document, {
42     childList: true,
43     subtree: true,
44   })
45 }
46 function getRenderTime() {
47   let startTime = 0
48   entries.forEach(entry => {
49     if (entry.startTime > startTime) {
50       startTime = entry.startTime
51     }
52   })
53 
54   // 需要和当前页面所有加载图片的时间做对比,取最大值
55   // 图片请求时间要小于 startTime,响应结束时间要大于 startTime
56   // performance.getEntriesByType('resource').forEach(item => {
57   //   if (
58   //     item.initiatorType === 'img'
59   //     && item.fetchStart < startTime
60   //     && item.responseEnd > startTime
61   //   ) {
62   //     startTime = item.responseEnd
63   //   }
64   // })
65 
66   return startTime
67 }

 

上报时机

第一点,必须要在 DOM 不再变化后再上报渲染时间,一般 load 事件触发后,DOM 就不再变化了。所以我们可以在这个时间点进行上报。

第二点,可以在 LCP 事件触发后再进行上报。不管是同步还是异步加载的 DOM,它都需要进行绘制,所以可以监听 LCP 事件,在该事件触发后才允许进行上报。

 1 let isOnLoaded = false
 2 executeAfterLoad(() => {
 3     isOnLoaded = true
 4 })
 5 
 6 
 7 let timer
 8 let observer
 9 function checkDOMChange() {
10     clearTimeout(timer)
11     timer = setTimeout(() => {
12         // 等 load、lcp 事件触发后并且 DOM 树不再变化时,计算首屏渲染时间
13         if (isOnLoaded && isLCPDone()) {
14             observer && observer.disconnect()
15             lazyReportCache({
16                 type: 'performance',
17                 subType: 'first-screen-paint',
18                 startTime: getRenderTime(),
19                 pageURL: getPageURL(),
20             })
21 
22             entries = null
23         } else {
24             checkDOMChange()
25         }
26     }, 500)
27 }

 

 

 

标签:&&,const,计算,observer,性能,item,startTime,entry,页面
From: https://www.cnblogs.com/peace1/p/18222580/pagePerformance

相关文章

  • 计算机毕业设计python-django生态评价网站系统flask框架
    网站主要使用的模式是管理员上传各地生态图片和一些土地,降雨,植被的数据,用户登录到网站上根据网站上的数据进行生态的评价,综合了多方面的想法和不同的建议,查看网站的人来说能够看到不同的想法,不局限于一种想法,也可以在网站上发表自己的看法,并作出相应的对策。采用前后端分离开发......
  • CSS3媒体查询与页面自适应示例
    CSS3媒体查询(MediaQueries)是CSS的一个强大功能,它允许你根据设备的特性(如视口宽度、分辨率等)来应用不同的样式。这在创建响应式网站(即能自动适应不同屏幕尺寸和设备的网站)时非常有用。以下是一个简单的CSS3媒体查询和页面自适应的示例:首先,我们假设有一个简单的HTML结构:<!DOCTY......
  • 【IEEE独立出版,浙江工业大学主办 | CISAT往届均已完成见刊EI Compendex,Scopus检索,会议
    2024年计算机应用与计算机图形学国际学术会议(CACG2024)将于2024年7月12-14日在中国·杭州召开,该会议作为第七届计算机信息科学与应用技术国际学术会议(CISAT2024)分会场召开。会议由浙江工业大学主办、浙江工业大学计算机科学与技术学院承办。会议旨在为从事计算机应用与计算机......
  • 两个跨域页面进行跳转传参的终极方案
    本文约定:A页面:跳转前的原来页面,假设为a.comB页面:将要跳转的目标页面,假设为b.com一、简单方案说到页面跳转,首先想到的就是用a标签://在A页面点击链接,并将参数data传到B页面<ahref="http://b.com?data=1"target="_blank"/>//在B页面接收A页面传过来的参数<script>va......
  • OpenCv之简单的人脸识别项目(人脸识别页面以及人脸比对页面)
    人脸识别准备三、人脸识别页面1.导入所需的包2.设置窗口2.1定义窗口外观和大小2.2设置窗口背景2.2.1设置背景图片2.2.2创建label控件3.定义两个全局变量4.定义选择并显示图片的函数4.1声明全局变量4.2设置文件选择对话框4.3设置条件语句4.4创建一个标签显示图像5.定义......
  • 安利一个高性能集合库
    在找现成的IntArrayList发现的:real-logic/agrona:HighPerformancedatastructuresandutilitymethodsforJavaBuffers-Threadsafedirectandatomicbuffersforworkingwithonandoffheapmemorywithmemoryorderingsemantics.Lists-Arraybackedlist......
  • Windows平台下使用C++计算文件MD5的方法
    #include<iostream>#include<windows.h>#include<tchar.h>#include<string>#include<cassert>#include<functional>typedefstd::basic_string<TCHAR>StringT;typedefstd::stringStringA;#define_PP_CAT_IMPL_......
  • 【计算思维作业】E.染色问题
    题目时间限制 1000 ms内存限制 64 MB题目描述有排成一行的n个方格,用红(Red)、粉(Pink)、绿(Green)三色涂每个格子,每格涂一色,要求任何相邻的方格不能同色,且首尾两格也不同色.求全部的满足要求的涂法,要求对结果取模20141001。输入数据多组输入(<=100组数据,读入以EOF结尾)......
  • 微信小程序之实现弹窗组件及点击弹窗按钮实现页面跳转
    创建一个名为PopupWindow的弹窗组件:   1、创建组件目录结构:    在项目的components目录下新建一个名为PopupWindow的文件夹,里面包含四个核心文件: PopupWindow.wxml 、PopupWindow.wxss、PopupWindow.js 、PopupWindow.json   2、编写组件文件......
  • 方法论与技术栈双管齐下的运维可用性能力建设(七)
    3)应急三把斧思路故障应急方法很多,在不同的业务场景、不同的自动化水平等因素背景下,同类的故障的应急处理方法也不一样,如果对每一类的应急方法的重视程度都一视同仁,比如演练、自动化工具等工作的投入上就会失去重点,所以建议在应急方法的管理过程中也要有侧重的、分阶段的完善。......