前端性能监控

前端性能参数,可以直接敲 performance。里面记录了各个性能指标。具体的各个参数,可以查看大佬们的总结

这里记录几个参数

1、首屏绘制(First Paint,FP)

就是白屏时间啦。

performance.getEntriesByType('paint')[0]

2、首屏内容绘制(First Contentful Paint,FCP)

就是首屏加载时间啦

performance.getEntriesByType('paint')[1]

3、可交互时间(Time to Interactive,TTI)

用户开始可操作时间,需要满足两个条件(资料来源于网上):

第一个条件是主线程的长任务(长任务是指耗时超过 50 ms)执行完成后,第二个条件是随后网络静默时间达到 5 秒,这里的静默时间是指请求数不超过 2 个, 排除失败的资源请求和未使用 GET 方法进行的网络请求。

// 需要借助谷歌提供的库
import ttiPolyfill from 'tti-polyfill'; 
ttiPolyfill.getFirstConsistentlyInteractive(opts).then((tti) => {});

这个对象虽然可以获取到各个数值,但是不知道何时调用,也就是不知道什么时候完成,才能获取到这个数值。可以用另外一个 PerformanceObserver 对象做事件监听。
实例代码来源于网上

let perfomanceMetrics = {}
const observer = new PerformanceObserver((list) => {
  for (const entry of list.getEntries()) {
    // `entry` is a PerformanceEntry instance.
    // `name` will be either 'first-paint' or 'first-contentful-paint'.
    // 注意 first-paint 和 first-contentful-paint 的 entryType 都是 paint
    const metricName = entry.name
    const time = Math.round(entry.startTime + entry.duration)
    if (metricName === 'first-paint') {
      perfomanceMetrics.fp = time
    }
    if (metricName === 'first-contentful-paint') {
      perfomanceMetrics.fcp = time
    }
  }
  console.log(perfomanceMetrics) 
})
// Start observing the entry types you care about.
observer.observe({entryTypes: ['paint']})

这里还多了两个参数指标。

顺着上面的监听方式,再看看下面两个指标的获取:

4、总阻塞时间(Total Blocking Time,TBT)

是指阻塞用户响应(比如键盘输入、鼠标点击)的所有时间。指标值是将 FCP 之后一直到 TTI 这段时间内的阻塞部分时间总和,阻塞部分是指长任务执行时间减去 50 毫秒。

// 可以简单看长任务的总耗时
observer.observe({ entryTypes: ['longtask'] })

5、最大内容绘制(Largest Contentful Paint,LCP)

最大内容绘画指的是视口内可见的最大图像或文本块的绘制时间。

observer.observe({entryTypes: ['largest-contentful-paint']})

这个可以一开始就进行监听,到事件触发自动记录数据。

performance 对象还可以用来打点,得到的数值比时间戳精度高

performance.mark('first paint time')
document.addEventListener('DOMContentLoaded', ()=> {
    performance.mark('dom ready')
})
window.onload = function() {
  performance.mark('page loaded')

  // ByName,就是自己打的点
  const fp = performance.getEntriesByName('first paint time')[0]
  console.log('first paint time: ', fp)

  const domReady = performance.getEntriesByName('dom ready')[0]
  console.log('dom ready: ', domReady)

  const pageLoad = performance.getEntriesByName('page loaded')[0]
  console.log('page loaded: ', pageLoad)

  // ByType,浏览器自己的类型,paint 包含了 first-paint、first-contentful-paint
  const paint = performance.getEntriesByType('paint')
  console.log('paint: ', paint)
}

总结一下,这里只是列了一些基础的性能指标,供自己记录一下。

对于以前的网站写法,可以用 window.onloadDOMContentLoaded 的回调时机来收集数据。但是对于现在的单页面应用,都是加载了页面,再执行 js 进行渲染,这两个时机就容易不准确了。用成 PerformanceObserver 方法会好一点。