前端监控sdk开发(四)长任务

引言

在前端开发中,长任务(Long Task)是指执行时间超过50毫秒的任务,它可能导致页面卡顿、响应延迟或用户体验下降。为了及时发现和解决这些问题,我们需要在前端监控SDK中实现长任务的捕获。

requestIdleCallback

requestIdleCallback是一个用于在浏览器空闲时执行回调函数的API,我们可以使用它来检测是否存在长任务。通过在回调函数中执行一段耗时较长的代码,并设置一个时间阈值,如果超过阈值,则认为存在长任务。

longTask.js

js 复制代码
export function longTask () {
  new PerformanceObserver((list) => {
    list.getEntries().forEach((entry) => {
      if (entry.duration > config.longTaskTime) {
        let lastEvent = getLastEvent()
        requestIdleCallback(() => {
          tracker.send({
            kind: 'experience',
            type: 'longTask',
            eventType: lastEvent?.type,
            startTime: entry.startTime,
            duration: entry.duration,
            selector: lastEvent ? getSelector(lastEvent.path || lastEvent.target) : ''
          })
        })
      }
    })
  }).observe({ entryTypes: ['longtask'] })
}

这段代码是一个用于监测长任务(long task)的函数。长任务是指执行时间较长的任务,可能会导致页面卡顿或响应变慢。

首先,代码定义了一个名为longTask的导出函数。这意味着该函数可以在其他地方被引用和调用。

在函数内部,它创建了一个PerformanceObserver对象,并通过构造函数的参数传入一个回调函数。PerformanceObserver是一个用于监测性能指标的接口,它可以观察到一系列性能条目(performance entries)。

回调函数接收一个参数list,代表观察到的性能条目列表。通过调用list.getEntries()方法可以获取到这个列表中的所有条目。

接下来,代码使用了forEach循环遍历每个性能条目。对于每个条目,它检查了其执行时间是否超过了配置中定义的阈值(config.longTaskTime)。如果超过了阈值,则表示这是一个长任务。

在长任务被检测到后,代码通过调用getLastEvent()方法获取最后一次用户交互事件(如点击、滚动等)。然后使用requestIdleCallback()方法来在浏览器空闲时执行回调函数。

在回调函数中,代码通过调用tracker.send()方法发送一个包含有关长任务的信息的请求。这些信息包括事件类型、开始时间、持续时间和选择器(用于获取触发长任务的元素)等。

总结起来,这段代码的作用是监测页面中执行时间较长的任务,并在这些任务被检测到后,发送相关信息以便进行进一步分析和优化。

上述所用到的getLastEventgetStackLinesgetSelector 可看前端监控sdk开发(二)js错误捕获

config.js

主要用于方便后续提供给用户的一些配置参数。用于初始化sdk的时候的一些参数。

js 复制代码
const config = {
  url: '', // 上报路径
  longTaskTime: 100, // ms
}

export function setConfig(options) {
  for (const key in config) {
    if (options[key]) {
      config[key] = options[key]
    }
  }
}

export default config

总结

通过使用requestIdleCallback可以检测是否存在长任务;结合使用PerformanceObserver和requestIdleCallback可以更全面地捕获长任务。在实际开发中,我们可以根据具体需求和场景选择合适的方式来实现长任务的捕获,并将捕获到的信息发送到监控服务器进行记录和分析,以提高应用程序的性能和用户体验。

相关推荐
m***119015 小时前
【前端】Node.js使用教程
前端·node.js·vim
QianhangQianping15 小时前
前端技术迭代深析:从 CSS 布局到状态管理的进化之路
前端·css
阿道夫小狮子15 小时前
Android 反射
android·前端·javascript
特级业务专家15 小时前
写埋点、扒 SDK、改框架:JS 函数复写 10 连招实战手册
前端
感谢地心引力15 小时前
【HTML Living Standard 01】HTML基础概述
前端·html
૮・ﻌ・15 小时前
Vue2(三):自定义指令、插槽、路由
前端·javascript·vue.js
快落的小海疼15 小时前
全局重复接口取消&重复提示
前端·vue.js
快落的小海疼15 小时前
前端导出页面内容为PDF
前端