首页 > 其他分享 >js检测页面性能指标

js检测页面性能指标

时间:2022-11-30 16:55:05浏览次数:60  
标签:monitor 请求 js window startTime entry 性能指标 页面

检测获取fp、fcp、lcp、cls性能指标:

window.monitor = {
  isWinLoad: false,
  observer: null,
  sessionValue: 0,
  sessionEntries: [],
  data: {
    fp: 0,
    fcp: 0,
    lcp: 0,
    cls: 0
  }
}
/**
PerformanceObserver类进行监听
 */
window.monitor.observer = new PerformanceObserver(function (list) {
  for (const entry of list.getEntries()) {
    // lcp获得
    if (entry.entryType === 'largest-contentful-paint') {
      window.monitor.data.lcp = entry.startTime
    }
    // cls计算
    if (entry.entryType === 'layout-shift') {
      // 只计算没有最近用户输入的布局移位。
      if (!entry.hadRecentInput) {
        const firstSessionEntry = window.monitor.sessionEntries[0]
        const lastSessionEntry = window.monitor.sessionEntries[window.monitor.sessionEntries.length - 1]

        // 如果该条目发生在前一个条目之后不到1秒,且在会话中的第一个条目之后不到5秒,则将该条目包含在当前会话中。否则,开始一个新的会话。
        if (
          window.monitor.sessionValue &&
              entry.startTime - lastSessionEntry.startTime < 1000 &&
              entry.startTime - firstSessionEntry.startTime < 5000
        ) {
          window.monitor.sessionValue += entry.value
          window.monitor.sessionEntries.push(entry)
        } else {
          window.monitor.sessionValue = entry.value
          window.monitor.sessionEntries = [entry]
        }
        // 如果当前会话值大于当前CLS值,则更新CLS及其表项。
        if (window.monitor.sessionValue > window.monitor.data.cls) {
          window.monitor.data.cls = window.monitor.sessionValue
        }
      }
    }
    // fp、fcp获得
    if (entry.entryType === 'paint') {
      if (entry.name === 'first-paint') {
        window.monitor.data.fp = entry.startTime
      }
      if (entry.name === 'first-contentful-paint') {
        window.monitor.data.fcp = entry.startTime
      }
    }
  }
})

/**
entryTypes还有其他类型,这里只监听三个类型
buffered 属性表示是否观察缓存数据,也就是说观察代码添加时机比事情触发时机晚也没关系。
 */
window.monitor.observer.observe(
  {
    entryTypes: ['paint', 'largest-contentful-paint', 'layout-shift'],
    buffered: true
  }
)

window.addEventListener('load', function () {
  window.monitor.isWinLoad = true
}, true)

window.addEventListener('beforeunload', function () {
  if (window.monitor.isWinLoad) {
    console.log(window.monitor)
    /**
beforeunload应该选择什么样的方式进行传输上报?
异步ajax是不可靠的,无非保证上报。

可选择方式有以下几种:

1、同步ajax
同步ajax会阻断浏览器的unload,直到ajax环节结束后才会继续进行unload。
此方法的缺点是由于页面会在ajax请求结束后才延迟卸载,会导致关闭时浏览器出现卡顿降低用户的体验。
注意:chrome不支持在页面关闭事件内使用同步XMLHttpRequest请求

2、beacon
beacon api设计就是用来解决页面卸载时发送请求的问题。他能保证在页面unload完成前请求能够被发送,并且由于其是异步且非阻塞的,并不会影响浏览器其他页面的显示效率。
sendBeacon只能发送http post请求。
问题:此方法无法自定义header信息,如果服务端设置了token权限拦截,sendBeacon并没有办法将token信息放入请求中。

3、fetch
fetch方法配合参数中的keepalive字段会让浏览器在页面卸载后在后台继续接管网络请求,该字段是必须的。
此方法的缺陷为keepalive字段一次只能承载最大64KB的请求内容,且该限制是所有并行请求共享的,即,页面卸载阶段所有fetch+keepalive请求的内容体总和不能超过64KB。

4、创建img携带信息
此方法是get请求方式将参数传递,get参数本身可携带信息有限,不可传递大量信息。

     */
  }
}, true)

  

其他性能指标日后更新,参考链接https://zhuanlan.zhihu.com/p/420330110

 

标签:monitor,请求,js,window,startTime,entry,性能指标,页面
From: https://www.cnblogs.com/MarsPGY/p/16927994.html

相关文章

  • 【Jmeter】21天打卡 09取样器之http不同方法Post提交表单和json
    作业要求:取样器之http不同方法post提交表单和json服务器名:httpbin.orgname api methodbodypost提交参数 postpostpost:123post提交JSON数据 postpost{"po......
  • 转 前端前辈 反压缩 js ,我的万花筒写轮眼开了,CV 能力大幅提升
    转 反压缩js,我的万花筒写轮眼开了,CV能力大幅提升摘要:前言因为比较菜,所以经常需要读一些别人的代码学习学习。有源码的代码当然好,但是很多网站不开源。这些网站的......
  • Angularjs的指令学习笔记
    1.指令ng-app ng-controller<scriptsrc="../js/angular.min.js"></script><body><divng-app="myApp"ng-controller="myCtrl">    {{firstName+""+lastName}......
  • Vue.js的学习笔记
    Vue.js1.简介vue介绍:vue是一个兴起的前端js库,是一个精简的MVVM。从技术角度讲,Vue.js专注于MVVM模型的ViewModel层。它通过双向数据绑定把View层和Model层连接了起......
  • js 手写防抖
    使用场景:多次操作只执行第一次操作。可以用于用户点击按钮事件防抖操作。多次操作只执行最后一次操作。可以搜索输入框,输入多个字符进行搜索,当输入停止之后进行搜索......
  • 微信公众号页面问题-关闭按钮
    场景:企业号应用A,首页加个按钮,点击直接关闭此页面,回到进入前的页面解决:调用微信 WeixinJSBridge.call('closeWindow');代码如下:1handleReturn(){2......
  • JVM问题诊断常用命令:jinfo,jmap,jstack
    1.jinfo描述:输出给定 java 进程所有的配置信息。包括 java 系统属性和 jvm用法:jinfo[option]pidjinfo[option]executablecorejinfo[option][server-id@]r......
  • js的所有的this指向和节流防抖
    所有的this指向普通函数重的this指向,wind对象中的方法this指向,该对象(是对象中的方法的this指向,不是对象中的this指向,对象是没有this指向的)事件绑定中的this指向,绑定的事......
  • js面向对象,封装构造函数
    面向对象and面向过程面向对象,只关注对象面向对象更适合软件,他不关注步骤,只关注结果面向过程,只关注过程面向过程更适合硬件,它有每一个步骤,而且它更关注每一步的过程构......
  • SpringMVC创建JSP页面的详细过程+配置模板+实现页面跳转+配置Tomcat。JSP和HTML配置模
    1、创建Maven项目2、填写项目基本信息、完成创建3、导入POM依赖打包方式设置为War包<packaging>war</packaging>依赖、可自行添加需要jar包依赖<dependencies>......