前言

前端页面性能是一个非常核心的用户体验指标。本文介绍 岳鹰全景监控平台 如何设计一个通用、低侵入性、自动上报的页面性能监控方案。主要采用的是Navigation Timing API以及sendBeacon等方法。

为什么要监控页面性能?

一个页面性能差的话会大大影响用户体验。用户打开页面等待的太久,可能会直接关掉页面,甚至就不再使用了,这种情况在移动端更加明显,移动端用户对页面响应延迟容忍度很低。

可以看到,页面性能体验差可能直接导致业务访问量下降、用户流失等问题。

虽然页面性能很重要,但是在实际使用中,页面性能差的情况并不少见。首先,在产品的迭代演进过程中,页面性能可能会被忽略,性能随着版本迭代而有所衰减;其次,性能优化是一项复杂而挑战的事情,需要明确的优化方向和具体的优化手段才能快速落地取效。

所以我们需要一个性能监控系统,持续监控和预警页面性能的状况,并且在发现瓶颈的时候指导优化工作。

页面性能和跳出率的关系 - 来自ThinkWithGoogle

理解Navigation Timing API的性能指标

为了帮助开发者更好地衡量和改进前端页面性能,W3C性能小组引入了 Navigation Timing API ,实现了自动、精准的页面性能打点;开发者可以通过 window.performance 属性获取。

  • performance.timing 接口(定义了从 navigationStartloadEventEnd 的 21 个只读属性)
  • performance.navigation(定义了当前文档的导航信息,比如是重载还是向前向后等)

下图是W3C第一版的 Navigation Timing 的处理模型。从当前浏览器窗口卸载旧页面开始,到新页面加载完成,整个过程一共被切分为 9 个小块:提示卸载旧文档、重定向/卸载、应用缓存、DNS 解析、TCP 握手、HTTP 请求处理、HTTP 响应处理、DOM 处理、文档装载完成。每个小块的首尾、中间做事件分界,取 Unix 时间戳,两两事件之间计算时间差,从而获取中间过程的耗时(精确到毫秒级别)。

W3C Navigation Timing Level 1(w3.org)

上图是 Level 1 的规范,2012 年底进入候选建议阶段,至今仍在日常使用中;但是在W3C的议程上,它已经功成身退,让位给了精度更高,功能更强大,层次更分明的 Level 2(处理模型如下图)。比如独立划分出来的 Resource Timing,使得我们可以获取具体资源的详细耗时信息。

W3C Navigation Timing Level 2(w3.org)

指标解读

采集页面性能的关键指标

使用上面的指标,我们可以计算许多重要的指标,如首字节的时间,页面加载时间,dns查找以及连接是否安全。我们把 Navigation Timing API 提供的指标做下归类,按照从上到下的时间流,右边的时刻标记了每个指标从哪里开始计算到哪里截止,比如,跳转时间 redirectredirectEnd - redirectStart 计算得到,其他的类推。

确定统计起始点 (navigationStart vs fetchStart )

页面性能统计的起始点时间,应该是用户输入网址回车后开始等待的时间。一个是通过navigationStart获取,相当于在URL输入栏回车或者页面按F5刷新的时间点;另外一个是通过 fetchStart,相当于浏览器准备好使用 HTTP 请求获取文档的时间。

从开发者实际分析使用的场景,浏览器重定向、卸载页面的耗时对页面加载分析并无太大作用;通常建议使用 fetchStart 作为统计起始点。

首字节

主文档返回第一个字节的时间,是页面加载性能比较重要的指标。对用户来说一般无感知,对于开发者来说,则代表访问网络后端的整体响应耗时。

白屏时间

用户看到页面展示出现一个元素的时间。很多人认为白屏时间是页面返回的首字节时间,但这样其实并不精确,因为头部资源还没加载完毕,页面也是白屏。

相对来说具备「白屏时间」统计意义的指标,可以取 domLoading - fetchStart,此时页面开始解析DOM树,页面渲染的第一个元素也会很快出现。

W3C Navigation Timing Level 2 的方案设计,可以直接采用 domInteractive - fetchStart,此时页面资源加载完成,即将进入渲染环节。

首屏时间

首屏时间是指页面第一屏所有资源完整展示的时间。这是一个对用户来说非常直接的体验指标,但是对于前端却是一个非常难以统计衡量的指标。

具备一定意义上的指标可以使用,domContentLoadedEventEnd - fetchStart,甚至使用 loadEventStart - fetchStart ,此时页面DOM树已经解析完成并且显示内容。

以下给出统计页面性能指标的方法。

let times = {};
let t = window.performance.timing;// 优先使用 navigation v2  https://www.w3.org/TR/navigation-timing-2/
if (typeof win.PerformanceNavigationTiming === 'function') {try {var nt2Timing = performance.getEntriesByType('navigation')[0]if (nt2Timing) {t = nt2Timing}} catch (err) {}
}//重定向时间
times.redirectTime = t.redirectEnd - t.redirectStart;//dns查询耗时
times.dnsTime = t.domainLookupEnd - t.domainLookupStart;//TTFB 读取页面第一个字节的时间
times.ttfbTime = t.responseStart - t.navigationStart;//DNS 缓存时间
times.appcacheTime = t.domainLookupStart - t.fetchStart;//卸载页面的时间
times.unloadTime = t.unloadEventEnd - t.unloadEventStart;//tcp连接耗时
times.tcpTime = t.connectEnd - t.connectStart;//request请求耗时
times.reqTime = t.responseEnd - t.responseStart;//解析dom树耗时
times.analysisTime = t.domComplete - t.domInteractive;//白屏时间
times.blankTime = (t.domInteractive || t.domLoading) - t.fetchStart;//domReadyTime
times.domReadyTime = t.domContentLoadedEventEnd - t.fetchStart;

SPA盛行之际

Navigation Timing API可以监控大部分前端页面的性能。但随着SPA模式的盛行,类似vue,reactjs等框架的普及,页面内容渲染的时机被改变了,W3C标准无法完全满足原来的监控意义。

幸运的是,目前W3C关于首屏统计已经进入了提议阶段,以Chrome为首的浏览器正在打造更能代表用户使用体验的FP、FCP、FMP指标,并且逐步开放API。

用户体验指标

注意点

  • 通过window.performance.timing所获的的页面渲染所相关的数据,在SPA应用中改变了url但不刷新页面的情况下是不会更新的。因此仅仅通过该api是无法获得每一个子路由所对应的页面渲染的时间。如果需要上报切换路由情况下每一个子页面重新render的时间,需要自定义上报。

数据上报方式

测量好时间后,就需要将数据发送给服务端。页面性能统计数据对丢失率要求比较低,且性能统计应该在尽量不影响主流程的逻辑和页面性能的前提下进行。

使用的img标签get请求

  • 不存在AJAX跨域问题,可做跨源的请求
  • 很古老的标签,没有浏览器兼容性问题
var i = new Image();
i.onload = i.onerror = i.onabort = function () {i = i.onload = i.onerror = i.onabort = null;
}
i.src = url;

navigator.sendBeacon

大部分现代浏览器都支持 navigator.sendBeacon方法。这个方法可以用来发送一些统计和诊断的小量数据,特别适合上报统计的场景。

  • 数据可靠,浏览器关闭请求也照样能发
  • 异步执行,不会影响下一页面的加载
  • API使用简单
window.addEventListener('unload', logData, false);function logData() {navigator.sendBeacon("/log", analyticsData);
}

最终方案

当浏览器支持sendBeacon方法,优先使用该方法,使用img方式降级上报。

岳鹰-WEB前端监控

经过1年左右时间的不断打磨,岳鹰WEB前端监控已经对外开放,欢迎免费体验试用。

技术交流、第一时间掌握产品动态,欢迎联系我们~

联系微信小助手(微信号 effirst-assistant)

加入钉钉群讨论(群号21964256)

参考

navigation-timing-2 https://www.w3.org/TR/navigation-timing-2/

Navigation API指南 https://s0developer0mozilla0org.icopy.site/en-US/docs/Web/Performance/Navigation_and_resource_timings

以用户为中心的性能指标 https://developers.google.com/web/fundamentals/performance/user-centric-performance-metrics?hl=zh-cn

页面性能对业务指标的影响 https://www.thinkwithgoogle.com/marketing-resources/data-measurement/mobile-page-speed-new-industry-benchmarks/

前端处理带t的时间_大厂实践:如何优雅的监控前端页面性能相关推荐

  1. 前端处理带t的时间_适合家用的跑步机?阿迪达斯轻爵T-19i跑步机测评|adidas|商用机...

    (原标题:适合家用的跑步机?阿迪达斯轻爵T-19i跑步机测评) 现在的跑步机市场上,商用高端跑步机跑带更长.电机更强.这是为了满足健身房开业时间与不同人群跑步需求,但机器体积都太大腾挪太方便,且起码要 ...

  2. 前端监控sdk 页面性能监控

    前端监控之页面性能监控 为什么要做前端监控? 更快发现问题和解决问题 做产品的决策依据 为业务扩展提供了更多可能性 指标数据监控 性能监控:首屏加载时间,卡顿率,http请求的响应时间,静态资源下载时 ...

  3. 前端开发需要学python吗_在选择学习Python开发还是前端开发时需要考虑哪些因素...

    首先,从技术体系结构来看,Python开发与前端开发是两个不同的学习方向,未来所从事的岗位和面对的任务场景也有较为明显的不同,但是Python开发与前端开发本身的发展前景都是比较不错的,未来的就业空间 ...

  4. 前端封装接口弹出错误_项目实践:SpringBoot三招组合拳,手把手教你打出优雅的后端接口...

    前言 一个后端接口大致分为四个部分组成:接口地址(url).接口请求方式(get.post等).请求数据(request).响应数据(response).如何构建这几个部分每个公司要求都不同,没有什么 ...

  5. 前端flv.js设置缓冲时间和大小_不可不知的 WEB 前端网站优化 —— 雅虎 34 条军规...

    不可不知的 WEB 前端网站优化 -- 雅虎 34 条军规 不得不说现在依然适用于大部分的网站 当年雅虎推荐了一套优化网站加载速度的34条法则(包括Yslow规则22条),以下是详细说明. 1. Mi ...

  6. 一文带你看透前端世界里的日期时间,对就是Date

    很高兴我们能够通过不同空间,不同时间,通过这篇博客相识,那一定是一种缘分,一种你和狗哥的缘分.今天我希望通过这篇博客对我所熟知的前端世界里的日期时间做一个汇总,不止是代码上的汇总哦! 目录 一.时区 ...

  7. 前端面试技巧和注意事项_前端面试百分之九十九过的技巧

    2020最全的前端面试指南,一个多月 1.8w 字的面试经验积累,凭借它最终成功入职大厂-- 今年的金三银四刚好赶上疫情,很多大公司都停止招聘甚至裁员,想跳槽的小伙伴被打的措手不及. 需求减少要求肯定 ...

  8. 那些年,大厂在用的技术(前端)

    0.前注 面对读者类型:入门.初级.中级前端开发者 本文部分参考和引用了别人的技术博客等,所有引用来源文章均已直接在文章内部标注或在标题3引用部分注明.若原作者认为有侵权嫌疑,请短消息我,我会尽快修改 ...

  9. 霖呆呆的中大厂面试记录及2年前端薪资对比(附赠学习方法)

    前言 呆呆最近挺感慨的,因为从四月中旬开始准备面试,到面各个中小公司,大厂,距离今天已经将近2个月了.期间经历过不少事情,也带来了些许的成长. 那么这篇文章主要是说明一下这段时间自己在面不同规模的公司 ...

最新文章

  1. bazel源码编译Tensorflow
  2. 2020年全国大学生智能汽车竞赛山东赛区比赛专家组工作方案
  3. linux curl https报错: curl: (35) SSL connect error
  4. IsDlgButtonChecked()
  5. android子视图无菜单,Android 菜单详解
  6. 巧做辅助线计算三角形角的度数
  7. hazelcast_Hazelcast的MapLoader陷阱
  8. html鼠标响应事件吗,学习JavaScript鼠标响应事件
  9. css的背景图片不显示,wepback打包时,css的背景图片显示不出来,求教!
  10. 方阵的迹(trace)及其微分(导数)
  11. C++中的struct与class继承方式
  12. 计算机无法安装蓝牙驱动,windows10系统安装蓝牙驱动图文教程|windows10系统如何安装蓝牙驱动...
  13. 向日葵显示服务器连接失败,向日葵连接服务器成功远程不
  14. python 分词字典的词性_NLP注2“自定义词性与词典实现”,笔记,字典,的
  15. C# 利用 OleDb 组件操作 Excel 进行文件读写操作
  16. js 数组遍历时删除元素方法总结
  17. 易基因技术推介|简化基因组甲基化测序研究解决方案
  18. 线性回归 原理及公式推导
  19. 赶紧收下这四个安卓手机通讯录丢失怎么恢复的技巧吧
  20. 我的世界java版电脑下载,我的世界国际版电脑版下载

热门文章

  1. ENBM内部测试试题 组建与维护企业网络试题
  2. python基础之socket编程
  3. 在AWS Lambda上运行脚本语言:PHP、Ruby和Go(外文翻译)
  4. 阿里云DDoS高防 - 访问与攻击日志实时分析(二)
  5. 2016-8-13第二周作业
  6. 蓝牙(BLE)应用框架接口设计和应用开发——以TI CC2541为例
  7. 从SAE又回到BAE,感觉好轻松
  8. java之redis篇(spring-data-redis整合)
  9. 如何在dnn禁止复制的问题
  10. vs oracle带参数更新,Oracle vs PostgreSQL Develop(23) - PL(pg)sql(参数声明)