前端性能的几个基础指标
2018.3.1更:
有赞·微商城(base杭州)部门招前端啦,最近的前端hc有十多个,跪求大佬扔简历,我直接进行内推实时反馈进度,有兴趣的邮件 lvdada#youzan.com,或直接微信勾搭我 wsldd225 了解跟多
有赞开源组件库·zanUI
前端性能的几个基础指标
先开门见山的罗列前端性能相关的几个基础指标名词。
- 白屏时间
- 首屏时间
- 用户可操作时间
- 页面总下载时间
为何会选择这几个时间节点以及各自的含义可以参考这篇文章 七天打造前端性能监控系统
另外本文搜集性能相关数据是用了高级浏览器的Performance Api
,大家可以参考这篇文章先行了解初探erformancep
正文
上图看了有和感受?当页面刷新后可视区域长时间停留在白屏状态,当一个阶段后页面突然全部刷出,而不是我们追崇的逐步加载显示的状态。
上图显示的是视口上部分已经展示,但是由于某种原因页面下部分的视图被阻塞,一段时间后,剩余页面突然刷出,也不符合页面逐步显示的体验。
上图的现象是可交互的区域已经出现在视口中了,用户也已经在可点击的地方进行狂点,但是图片资源没有加载完可导致点击事件没有绑定,点击无效。这种交互体验也是不能容忍的。
上面几个例子正好可以带出两个性能指标 白屏时间
和 用户可操作时间
白屏时间: 用户从打开页面开始到有页面开始呈现为止。
用户可操作时间: 用户可以进行正常的事件输入交互操作。
接下来我们通过Performance Api
看看如何得到这两个指标的数据。
http://www.w3.org/TR/navigati...
上图来自官方,从左到右代表了浏览器打开一个页面内部的一系列状态。左边红线代表的是网络传输层面的过程,这篇文章不过多讲述,右边红线代表了服务器传输回字节后浏览器的各种事件状态,也就是上图中的responseEnd
之后。这个阶段包含了浏览器对文档的解析,dom树构建,布局,绘制等等。下面详细说明。
在浏览器console中输入performance.timing
,返回的各字节跟上图performance流程的各状态一一对应,并返回时间。
上图简单说明了一下performance timing api
在几个流程下所代表的含义。至于为何到达domInteractive
状态时代表了Dom tree 构建完成
我在下文还会解释到。
上图演示了一个页面加载时Chrome的调试工具中的Network
会显示两条竖线,一蓝一红,蓝的代表document触发了domContentLoaded
事件,红线代表了document触发了load
事件。
理一理
我们说到了当document到达domInteractive
状态时代表了dom树的构建完成
,也代表了可以绑定事件,即用户可交互时间已经到达,也代表了触发domContentLoaded
事件,也即代表Chrome调试中蓝线的出现。
但这一连串因果又是从何得到的呢?
深剖why
上图说明在浏览器拿到文档首字节之后,即上文提到的responseEnd
之后。浏览器将html解析并构建成DOM tree,并同时将css解析成CSSOM。在没有js的参与下,这个过程是同步的。
但一旦有js的参与,这个平衡就被破坏了。
- 同步的javascript可以改写文档在任何节点,因此DOMtree 一旦碰上script标签(同步)就会停止构建。script也会阻塞img资源的下载。
- javascript能查询dom对象的可被计算的样式,CSSOM构建完才能轮到js的执行(仅位于script之前的css文件(内嵌、外链)才会阻塞js的执行,若样式文件在script之后,则此样式文件不会阻塞script)
这两点的解释说明可以看这里和这里
由于上面两个原因,导致html的解析构建与css构建成CSSOM有了依赖关系
然后我们看一下官方文档
这里解释了document到达interactive
状态所代表的含义,我先将其中一块信息隐藏。根据这个说明,当文档解析完成但是,一些例如图片这些资源还没有加载完成的情况下,document到达interactive
状态,并且触发DOMContentLoaded
事件触发。下面来看一个实例。
结合上面的深剖,CSSOM构建阻塞了js的执行,所以在这幅图中js早已加载完,还是要等到css的下载完成才能执行,而js的被阻塞,又导致了html文档的解析DOM树的构建。再根据官方的说明,dom树的构建完成才意味着interactive
到达,意味着蓝线的出现。
但我们再看下官方说明的原话。
是的,刚刚被我遮盖掉的是stylesheets
样式表。这里又明确提到了不等stylesheets
样式表下载完成,一旦html解析dom树构建完document就立马到达interactive
状态。这不是跟我们刚刚的例子相反了吗?
再看个例子
这个例子蓝线停在了css文件下载完成之前,说明也验证了后一种说法。那到底是哪个对?
答案当然是都对,我们在最之前就说明了,在没有js参与的情况下,html的解析DOM树的构建和CSSOM的构建是平行的,谁也不碍着谁,interactive
状态的变更直接取决于html的解析完成度,所以在这种情况下,不等css加载完,html一旦解析完成,document状态立马变更为interactive
。第二个例子是没有js引入的。
深剖小结
上述的引入的js只是同步的。也就是不带defer 或 async的script标签。一旦引入了带defer或async的script标签,js、css的依赖关系又变了。这里就不详谈了,可以看一篇外文Deciphering the Critical Rendering Path
或者我的翻译版本我的翻译
总结
现在我们再来看一下domContentLoaded
和load
事件。现在应该能清楚为何domContentLoaded
事件触发代表了用户可交互事件,以及
$(function () {})
jquery中的这个写法就是基于这个事件。
最后,我们回头看下开头指出的衡量页面性能的四个基础指标,以及各自的求法。
- 白屏时间:除了可以使用现成的
performance api
,我们还可以在head之间头尾插入两个script计算时间差
<head>
<script>
var t = new Date().getTime();
</script>
<link src="">
<link src="">
<link src=""><script>
tNow = new Date().getTime() - t;
</script>
</head>
这样做可行的原理:第一个script不受css阻塞,最后的script受css阻塞,会等到样式都下载完才执行,执行完后便是body
的解析,之后是dom tree构建,布局,绘制然后呈现在屏幕上。
- 用户可交互时间:根据
performance api
在根据之前的讲述,可得domContentLoadedEventEnd - navigationStart
参考:
performance api
关键路径
performance api github
分析关键呈现路径性能
初识performance
jscss顺序
S 和 CSS 的位置对其他资源加载顺序的影响
7 天打造前端性能监控系统
完!
原创文章 转载请注明出处!
前端性能的几个基础指标相关推荐
- 关于前端性能优化问题,认识网页加载过程和防抖节流
前端性能优化-网页加载过程.性能优化方法.防抖和节流 一.网页加载过程 1.加载资源的形式 2.加载资源的过程 3.渲染页面的过程 4.关于window.onload 和 DOMContentLoad ...
- 前端性能优化(一)性能优化的指标和工具
前端性能优化(一)性能优化的指标和工具 一.性能指标 1. F12 network进行调试,我们以淘宝为例 2. 此外还有一个瀑布流的概念 waterfall 3.蓝线和红线 4.保存当前网页指标,方 ...
- 前端性能监控相关指标
前端性能监控相关指标 最初,评价前端页面加载性能有两个指标:DOMContentLoaded和load事件,分别代表DOM构造完成和首屏资源加载完成. DOM 文档加载步骤: 解析 html 结构 加 ...
- 前端性能优化基础知识--幕课网
作为一个前端小码农,在页面样式都能实现以后,就开始考虑:同一个效果,我该用什么样的方式和代码去实现它比较规范?前两天逛幕课网发现了两门课程–<前端性能优化-基础知识认知>和<前端性能 ...
- 前端性能优化指标 + 检测工具
前端性能优化指标 + 检测工具 文章目录 前端性能优化指标 + 检测工具 整体概览 FCP(First Contentful Paint) LCP(Largest Contentful Paint) ...
- 性能测试之前端性能优化(前端基础知识,前端性能测试常用工具,前端性能优化常见方法)
目录 1. 前端基础知识 1.1 为什么要关注前端页面的性能,了解页面的加载,渲染方式和顺序? 1.2 一次页面请求会经历哪些步骤? 1.3 页面的展示过程 2. 前端性能测试的常用工具 2.1 Go ...
- 【系列文章】前端性能优化指标解读及实用优化工具使用教程
文章目录 写在前面 前端性能优化的意义 常见性能指标 常见性能分析工具 Lighthouse 性能指标解读 ==FCP== First Contentful Paint : 第一个可见元素绘制展现的时 ...
- 何崚谈阿里巴巴前端性能优化最佳实践
转载:http://www.infoq.com/cn/interviews/hl-alibaba-front-end-performance-optimization 大家好,我现在在阿里巴巴园区采访 ...
- web前端性能意义、关注重点、测试方案、优化技巧
1.前段性能的意义 对于访问一个网站,最花费时间的并不是后端应用程序处理以及数据库等消耗的时间,而是前端花费的时间(包括请求.网络传输.页面加载.渲染等).根据web优化的黄金法则: 80%的最终用户 ...
最新文章
- Django 框架13: 自定义过滤器和标签
- 自定义注解-aop实现日志记录
- DL:神经网络算法简介之Affine 层的简介、使用方法、代码实现之详细攻略
- stm32f103插拔pc端的串口引起的问题及解决办法
- 【图文】Allegro测量工具同时显mil和mm
- SQL 2008升级SQL 2008 R2完全教程或者10 00 1600升级10 50 1600
- orcale库表增加一个字段,自动设置为系统默认时间
- win10怎么更新显卡驱动_AMD Radeon 20.5.1 驱动程序更新:新增支持 Win10 版本 2004
- 高级项目经理的企业需求、企业地位
- 轻松理解java前期绑定(静态绑定)与后期绑定(动态绑定) 的区别。
- 手机游戏无障碍设计——猜地鼠之Android篇
- git cherry-pick 多分支的代码库,将代码从一个分支转移到另一个分支
- 【Skynet】开始创建服务的代码流程
- Oracle数据库管理系统(安装及入门教学)
- 索尼g8441是什么版本_复兴之路!索尼新机G8341/G8441现身波兰
- Java 设计模式 轻读汇总版
- C语言用数组计算成绩平均值,C程序使用数组计算平均值
- 【黄啊码】php结合微信公众号实现裂变海报(基本技术点)
- 计算机应用基础知识点讲解微课,计算机应用基础教学应用微课的思考
- 2019 谷歌开发者大会, 参会记录
热门文章
- gunicorn多进程不死_WEB,gunicorn - 无论是多进程、多线程、协程模式,同一个浏览器窗口多个标签页访问同一个url,看上去不会并发的问题...
- python如何创建不同元素的矩阵_Python numpy学习(2)——矩阵的用法
- cocos2d实现语音_Cocos2d-x 3.2 Lua示例CocosDenshionTest(音频测试)
- python tkinter entry默认值_Python Tkinter Entry和Text的添加与使用详解
- zs040蓝牙模块使用方法_三菱CCLINK-IE网络模块使用方法
- python怎么实现输入多行文字_介绍一个Python 包,几行代码可实现 OCR 文本识别!...
- FIO工具测试延迟、带宽、IOPS
- maven、gradle依赖分析
- 笔记-软考高项-错题笔记汇总1
- Android+Java中使用RSA加密实现接口调用时的校验功能