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
或者我的翻译版本我的翻译

总结

现在我们再来看一下domContentLoadedload事件。现在应该能清楚为何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. 关于前端性能优化问题,认识网页加载过程和防抖节流

    前端性能优化-网页加载过程.性能优化方法.防抖和节流 一.网页加载过程 1.加载资源的形式 2.加载资源的过程 3.渲染页面的过程 4.关于window.onload 和 DOMContentLoad ...

  2. 前端性能优化(一)性能优化的指标和工具

    前端性能优化(一)性能优化的指标和工具 一.性能指标 1. F12 network进行调试,我们以淘宝为例 2. 此外还有一个瀑布流的概念 waterfall 3.蓝线和红线 4.保存当前网页指标,方 ...

  3. 前端性能监控相关指标

    前端性能监控相关指标 最初,评价前端页面加载性能有两个指标:DOMContentLoaded和load事件,分别代表DOM构造完成和首屏资源加载完成. DOM 文档加载步骤: 解析 html 结构 加 ...

  4. 前端性能优化基础知识--幕课网

    作为一个前端小码农,在页面样式都能实现以后,就开始考虑:同一个效果,我该用什么样的方式和代码去实现它比较规范?前两天逛幕课网发现了两门课程–<前端性能优化-基础知识认知>和<前端性能 ...

  5. 前端性能优化指标 + 检测工具

    前端性能优化指标 + 检测工具 文章目录 前端性能优化指标 + 检测工具 整体概览 FCP(First Contentful Paint) LCP(Largest Contentful Paint) ...

  6. 性能测试之前端性能优化(前端基础知识,前端性能测试常用工具,前端性能优化常见方法)

    目录 1. 前端基础知识 1.1 为什么要关注前端页面的性能,了解页面的加载,渲染方式和顺序? 1.2 一次页面请求会经历哪些步骤? 1.3 页面的展示过程 2. 前端性能测试的常用工具 2.1 Go ...

  7. 【系列文章】前端性能优化指标解读及实用优化工具使用教程

    文章目录 写在前面 前端性能优化的意义 常见性能指标 常见性能分析工具 Lighthouse 性能指标解读 ==FCP== First Contentful Paint : 第一个可见元素绘制展现的时 ...

  8. 何崚谈阿里巴巴前端性能优化最佳实践

    转载:http://www.infoq.com/cn/interviews/hl-alibaba-front-end-performance-optimization 大家好,我现在在阿里巴巴园区采访 ...

  9. web前端性能意义、关注重点、测试方案、优化技巧

    1.前段性能的意义 对于访问一个网站,最花费时间的并不是后端应用程序处理以及数据库等消耗的时间,而是前端花费的时间(包括请求.网络传输.页面加载.渲染等).根据web优化的黄金法则: 80%的最终用户 ...

最新文章

  1. Django 框架13: 自定义过滤器和标签
  2. 自定义注解-aop实现日志记录
  3. DL:神经网络算法简介之Affine 层的简介、使用方法、代码实现之详细攻略
  4. stm32f103插拔pc端的串口引起的问题及解决办法
  5. 【图文】Allegro测量工具同时显mil和mm
  6. SQL 2008升级SQL 2008 R2完全教程或者10 00 1600升级10 50 1600
  7. orcale库表增加一个字段,自动设置为系统默认时间
  8. win10怎么更新显卡驱动_AMD Radeon 20.5.1 驱动程序更新:新增支持 Win10 版本 2004
  9. 高级项目经理的企业需求、企业地位
  10. 轻松理解java前期绑定(静态绑定)与后期绑定(动态绑定) 的区别。
  11. 手机游戏无障碍设计——猜地鼠之Android篇
  12. git cherry-pick 多分支的代码库,将代码从一个分支转移到另一个分支
  13. 【Skynet】开始创建服务的代码流程
  14. Oracle数据库管理系统(安装及入门教学)
  15. 索尼g8441是什么版本_复兴之路!索尼新机G8341/G8441现身波兰
  16. Java 设计模式 轻读汇总版
  17. C语言用数组计算成绩平均值,C程序使用数组计算平均值
  18. 【黄啊码】php结合微信公众号实现裂变海报(基本技术点)
  19. 计算机应用基础知识点讲解微课,计算机应用基础教学应用微课的思考
  20. 2019 谷歌开发者大会, 参会记录

热门文章

  1. gunicorn多进程不死_WEB,gunicorn - 无论是多进程、多线程、协程模式,同一个浏览器窗口多个标签页访问同一个url,看上去不会并发的问题...
  2. python如何创建不同元素的矩阵_Python numpy学习(2)——矩阵的用法
  3. cocos2d实现语音_Cocos2d-x 3.2 Lua示例CocosDenshionTest(音频测试)
  4. python tkinter entry默认值_Python Tkinter Entry和Text的添加与使用详解
  5. zs040蓝牙模块使用方法_三菱CCLINK-IE网络模块使用方法
  6. python怎么实现输入多行文字_介绍一个Python 包,几行代码可实现 OCR 文本识别!...
  7. FIO工具测试延迟、带宽、IOPS
  8. maven、gradle依赖分析
  9. 笔记-软考高项-错题笔记汇总1
  10. Android+Java中使用RSA加密实现接口调用时的校验功能