文章第一句话为“这是我参与「第五届青训营 」伴学笔记创作活动的第 26 天,今天主要学习了前端监控SDK开发,以下是我在课堂上做的课堂笔记:
前端监控的一些基础
是什么?
在上面这张图中有一句话很简练:前端监控就是尽可能的采集在这一过程以及后续用户交互中产生的性能指标与发生的异常事件并上报到平台完成消费。(简言之就是检查错误并上报平台,予以修复)。网络上查的前端监控:一般分为三种,分别是页面埋点(监控数据)、性能监控、以及异常监控(代码报错、接口异常上报)。
功能?
前端监控的功能:前端监控通过对页面数据的采集和上报,来帮助开发者更快速的对质量差的页面进行分类和归因。研究表明:性能不佳会对业务目标产生负面影响。例如,BBC发现他们的网站加载每增加一秒,他们就会失去百分之十的用户。
那么,前端监控到底监控什么呢?监控:性能指标、用户行为、异常事件。
前端监控之常用指标
Web性能标准的诞生
关于Web性能标准的诞生推荐大家去百度搜索。
传统的性能指标
传统的性能指标主要依赖Navigation Timing(此链接为另外一个作者的)或者Navigation Timing2,通过记录一个文档从发起请求到加载完毕的各阶段的性能耗时,以加载速度来衡量性能。下图是:Navigation Timing2
以用户为中心的性能指标
传统的性能指标专注于容易衡量的技术细节,但是他们很难反应出用户真正关心的是什么。如果你仅仅把加载速度优化的更快,你仍然会发现用户的网站体验很差。这就是创建以用户为中心性能指标的原因,它们专注于用户视角下的浏览体验。
以用户为中心的性能指标就是用户的体验,而用户体验又可以看成这四个问题(括号里面的是对应的指标):发生了吗(FP,FCP)?内容有用吗(FMP,SI,LCP)?内容可用吗(TTI,TBT)?令人愉悦吗(FID,CLS)?
FP(First Paint):首次渲染的时间点。FP之前用户看到的是没有任何内容的白色屏幕。
FCP(First Contentful Paint):首次有内容渲染的时间点。
FMP(First Meaningful Paint):首次绘制有意义内容的时间点。
SI(Speed Index):衡量页面可视区域加载速度,帮助检测页面的加载体验差异。
TTI(Time to Interactive):衡量页面从开始加载到主要子资源完成渲染,并能够快速、可靠的响应用户输入所需的时间。TTI反映页面可用性的重要指标,TTI值越小代表用户可以更早的操作页面,用户体验就更好。
FID(First Input Delay):测量从用户第一次与页面交互(比如当他们单击链接、点击按钮等等)直到浏览器对交互做出响应,实际能够开始处理事件时处理程序所经过的时间。
LCP(Largest Contentful Paint):最大的内容(让你理解页面内容的最有用的元素)在可视区域内变得可见的时间点。
TBT(Total Blocking Time):量化主线程在空闲之前的繁忙程度,有助于理解在加载期间,页面无法响应用户输入的时间有多久。一个页面的TBT,是从FCP到TTI之间所有长任务(如果一个任务在主线程上运行超过50毫秒,那么它就是长任务。超过50毫秒后的任务耗时,都算做任务的阻塞时间)的阻塞时间的总和。
CLS(Cumulative Layout Shift):量化了页面在加载期间,视口中元素的移动程度.
前端监控之前端常见异常
前端常见的异常有:静态资源异常、请求异常、Js错误、白屏异常
静态资源错误
静态资源:加载页面所需的html、css、js等文件,以及其他各类多媒体文件(图片、视频、音频等)。
静态资源错误:在拉取和加载静态资源的过程中发生了预期之外的错误。如网络异常等,导致静态资源无法正常的渲染到页面上。
请求异常
Js错误
Js错误:Js错误有很多类型。
在页面运行时发生的Js错误会严重影响页面的渲染与交互。是前端监控的重点。
白屏异常
通常我们可以通过判断DOM树的结构来粗略地判断白屏是否发生。
通常导致白屏发生的原因有以下几点:1.发射管Js错误导致关键资源渲染失败。2.请求异常或静态资源加载失败。3.长时间的JS线程繁忙阻塞了渲染任务。
监控前端性能与异常
利用performance和performance observer可以监控到一些标准的渲染性能数据。
利用window.addEventListener的error和unhandledrejection可以监控到全局的JS错误。
利用window.addEventListener的error事件可以监控到静态资源错误,注意和JS error进行区分。
通过hook xhr和fetch对象来监听请求时发生的错误。
封装一个通用的SDK
sdk主要有两步:数据采集、组装上报,前面已经完成了采集和组装,现在差一个上报。
专为前端监控打造的请求函数:Navigator.sendBeacon()。之后我们将之前的监控器按需加载到SDK中,从而封装一个完整的SDK。
小结
以上就是课堂上所讲的内容,图片也均出自字节跳动青训营视频之中,谢谢大家的阅读。