分析不同类型页面渲染过程

现在让我们看看浏览器从网络上加载资源所耗费的时间(我们忽略从缓存以及从CDN等中间商网络上加载资源),我们首先要知道的是:

  • 一个到无服务的网路往返 (传播延迟) 大约100ms
  • 服务器对于HTML文档的响应大约100ms,对于其他资源大约10ms

The Hello World experience

<html><head><meta name="viewport" content="width=device-width,initial-scale=1"><title>Critical Path: No Style</title></head><body><p>Hello <span>web performance</span> students!</p><div><img src="awesome-photo.jpg"></div></body>
</html>

我们只是加载了时间和网页——没有任何的js和css资源等——我们的页面非常简单,下面我们看看谷歌浏览器开发者工具里记录下载用的时间:

CRP

HTML文档大约花费200ms来加载。注意上面的蓝色透明进度条表明了网路上的一个往返,这里我们的HTML文档非常的小(小于4k),我们只是进行了简单的文件抓取工作,一半的时间来等待网络响应,一般的时间花费在服务器响应上,总用时大于200ms。

一旦HTML文档内容可以使用,浏览器开始解析HTML内容(全部是字节),将其转化成tokens,然后建立DOM树。注意在工具条最下面显示了DOMContentLoaded事件花费的时间是216毫秒,也就是对应的蓝色垂直实线。在蓝色透明进度条和蓝色垂直实线之间的时间就是浏览器建立DOM树的时间——在上例中只是花费了几毫秒。

注意我们的“awesome photo”没有阻塞任何的DOMContentLoaded事件,所以我们可以直接构造render tree甚至将内容显示在屏幕上,不用等待图片资源:不是所有的资源都会阻塞渲染!所以,在谈论渲染过程的时候,我们只是谈论了js,css和html标记。图片虽然不会阻塞渲染,但是我们仍旧应该让其迅速加载显示。

但是,“load”事件(也被叫做"onload")事件却被图片加载阻塞:因为load事件是在所有资源加载完毕之后触发,上图中也即是最后的红色垂直实线,也就是工具条最下面显示的load:335ms,这也是浏览器加载器停止加载的时间点。

Adding JavaScript and CSS into the mix

实际的编程中肯定需要css和js,所以让我们在其中加入css和js:

<html><head><title>Critical Path: Measure Script</title><meta name="viewport" content="width=device-width,initial-scale=1"><link href="style.css" rel="stylesheet"></head><body onload="measureCRP()"><p>Hello <span>web performance</span> students!</p><div><img src="awesome-photo.jpg"></div><script src="timing.js"></script></body>
</html>

在加入js和css之前:

DOM CRP

在加入js和css之后

DOM, CSSOM, JS

css文件和js文件都在异步同时被加载,这是好事!注意load和DOMContentLoaded和之前的微妙的不同:

  • 不像只是简单的HTML文件(不包含任何的css和js),包含js和css的文件还需要将css编程CSSOM树,以及CSSOM树和HTML树相互结合形成render tree的过程。
  • 因为js文件可能要处理CSSOM,所以css文件必须在执行js文件之前执行!并且css的下载将会阻塞domContentLoaded事件。

如果我们将js直接写在html内部呢?

外部js导入:

DOM, CSSOM, JS

直接书写js:

DOM, CSSOM, and inlined JS

虽然我们减少了一次加载请求,但是事件是差不多的,因为在解析script标签的时候将会阻塞直到CSSOM被创建完成。同时,从上图中我们可以看见,css和js文件的加载是平行进行的。

所以,我们有什么策略来减少事件呢?

让我们在js文件中加入async异步关键字:

<html><head><title>Critical Path: Measure Async</title><meta name="viewport" content="width=device-width,initial-scale=1"><link href="style.css" rel="stylesheet"></head><body onload="measureCRP()"><p>Hello <span>web performance</span> students!</p><div><img src="awesome-photo.jpg"></div><script async src="timing.js"></script></body>
</html>

 

 

同步内部加载js:

DOM, CSSOM, JS

异步外部加载js:

DOM, CSSOM, async JS

可以看见domContentLoade事件在HTML解析完成后马上执行:浏览器知道了不要在处理js中对其进行阻塞,因为没有了其他渲染的阻塞,CSSOM构造可以同时进行。

我们可以同时在文件内部书写js和css文件内容,而不是外部引入:

<html><head><title>Critical Path: Measure Inlined</title><meta name="viewport" content="width=device-width,initial-scale=1"><style>p { font-weight: bold }span { color: red }p span { display: none }img { float: right }</style></head><body><p>Hello <span>web performance</span> students!</p><div><img src="awesome-photo.jpg"></div><script>var span = document.getElementsByTagName('span')[0];span.textContent = 'interactive'; // change DOM text content
      span.style.display = 'inline';  // change CSSOM property// create a new element, style it, and append it to the DOMvar loadTime = document.createElement('div');loadTime.textContent = 'You loaded this page on: ' + new Date();loadTime.style.color = 'blue';document.body.appendChild(loadTime);</script></body>
</html>

DOM, inline CSS, inline JS

可以看见domContentLoaded事件的时间和异步加载外部js文件例子中个domContentLoadedNotice时间差不多。

将css和js文件内容直接书写在html文件内部,虽然会让html变得非常庞大,但是可以减少外部资源的加载。

优化模式

最简单的html就是没有css和js亦或依他资源,只有html内容。

渲染这种页面,浏览器你需要初始化请求,等待html文档加载完成,解析它,建立DOM树,最后渲染到屏幕上:

<html><head><meta name="viewport" content="width=device-width,initial-scale=1"><title>Critical Path: No Style</title></head><body><p>Hello <span>web performance</span> students!</p><div><img src="awesome-photo.jpg"></div></body>
</html>

 

Hello world CRP

 T0 和T1 之间的时间捕捉了网络和服务器操作的时间。

 在理想情况下(如果HTML文档足够小),所有我们需要做的就是使用一个网络往返来获取整个文件——根据TCP传输协议,文件越大需要越多的网络往返。所以上图是建立在最理想的状况下,加载文件只要一个网络往返。

让我们增加css文件:

<html><head><meta name="viewport" content="width=device-width,initial-scale=1"><link href="style.css" rel="stylesheet"></head><body><p>Hello <span>web performance</span> students!</p><div><img src="awesome-photo.jpg"></div></body>
</html>

DOM + CSSOM CRP

我们使用了一个网络往返来获取HTML资源,在将内容最终渲染到屏幕上之前我们必须要加载css文件,所以我们使用了一个网络往返来获取css文件,最后渲染页面。注意我们这里每次获取资源使用一个网络往返是建立在资源非常小的情况下,也就是说最理想的状态下。

让我们使用关键术语来描述渲染过程:

  • 关键资源: 资源可能会阻塞页面的渲染(这是使用可能是因为图片等资源是不会阻塞页面的渲染的,只有css和js资源会)
  • 渲染路径长度: 网络往返的次数,亦或获取所有资源的总时间 number of roundtrips, or the total time required to fetch all of the critical resources.
  • 关键字节: 页面第一次渲染时所需要的字节数,也就是将关键资源文件大小的总和。
  • 我们上面第一个最简单的网页形式的例子,就包含了一个关键资源(HTML文档),关键路径长度是1个网络往返(假设文件非常小),总共的关键字节是HTML文档的字节大小。

让我们比较上面HTML+CSS文件的渲染过程:

DOM + CSSOM CRP

  • 2 关键文件:CSS文件和HTML文档
  • 2 或者更多的路径长度:加载css和HTML时所分别需要一个网络往返 
  • 9 KB 的关键字节:2个关键文件的总和

现在让我们加入js:

<html><head><meta name="viewport" content="width=device-width,initial-scale=1"><link href="style.css" rel="stylesheet"></head><body><p>Hello <span>web performance</span> students!</p><div><img src="awesome-photo.jpg"></div><script src="app.js"></script></body>
</html>

过程是,加载完了HTML之后,同时加载css和js文件,因为js要查询CSSOM,所以必须等到cssom建立完成知乎才可以运行js,之后建立DOM,最后渲染页面。

DOM, CSSOM, JavaScript CRP

  • 3 个关键文件:CSS和JS和HTML文件分别一个
  • 2 或者更多的路径长度:因为加载css和js是同时进行的,也就是说在同一个网络往返中,加载HTML进行了一次网络往返
  • 11 KB 的关键字节:3个关键文件的大小综合

异步加载js文件:

<html><head><meta name="viewport" content="width=device-width,initial-scale=1"><link href="style.css" rel="stylesheet"></head><body><p>Hello <span>web performance</span> students!</p><div><img src="awesome-photo.jpg"></div><script src="app.js" async></script></body>
</html>

 

 

DOM, CSSOM, async JavaScript CRP

异步加载js的好处:

  • js脚本不会让浏览器在解析其他文件时对其进行阻塞,也不会影响关键渲染进程
  • 因为关键文件中不再包含js脚本文件,css同样不需要阻塞domContentLoaded事件
  • domContentLoaded事件越快被触发,其他的应用逻辑也会越快被执行

所以,最后的结果是我们只有两个关键文件,且我们只有两个路径长度(因为我们只进行了两次网路往返),并且9kb的关键字节。

 

如果css只是针对打印机设备呢?

<html><head><meta name="viewport" content="width=device-width,initial-scale=1"><link href="style.css" rel="stylesheet" media="print"></head><body><p>Hello <span>web performance</span> students!</p><div><img src="awesome-photo.jpg"></div><script src="app.js" async></script></body>
</html>

DOM, non-blocking CSS, and async JavaScript CRP

因为css资源只是用于打印机设备,所以浏览器不需要下载css时进行渲染阻塞,所以,一旦DOM构造完成,浏览器就有足够的信息来渲染页面!

所以,文档只有一个关键文件(HTML文档),最小的渲染路径(只有一个网络往返)。

 

原文:https://developers.google.com/web/fundamentals/performance/critical-rendering-path/analyzing-crp?hl=en

转载于:https://www.cnblogs.com/RachelChen/p/5456189.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/396101.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ImageLoader加载图片

先导universal-image-loader-1.9.3包 在application配置 android:name".MyApplication" intent权限 1 package com.ch.day13_imageloaderdemo;2 3 import java.io.File;4 5 import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiscCache; 6 impor…

Access denied for user 'root'@'localhost' (using password: YES) 问题解决小记

初学php&#xff0c;按照视频安装后好mysql后 终端运行命令 mysql -u root -p 然后输入安装mysql时输入的密码六个1&#xff0c;会报这样的错误&#xff1a;Access denied for user rootlocalhost (using password: YES) &#xff1b; 百度了一大堆&#xff0c;大海捞针一般找…

创业者具备的五大技能_一、如今大学生创业需要具备哪些知识与技能?

我参加过两次互联网&#xff0b;大赛&#xff0c;分别获得过省赛的金奖与银奖&#xff0c;还曾参加山东省大大小小比赛26场&#xff0c;金奖累计获得12次。对当代创业的大学生所应具备哪些基本素质深有体会。&#xff08;1&#xff09;技能&#xff1a;1、自我认知及科学规划能…

BZOJ3387栅栏行动

首先&#xff0c;很容易想到Dp。设f[i][0]表示第i个栅栏走左边的最短路&#xff0c;f[i][1]表示第i个栅栏走右边的最短路。 所以&#xff0c;我们要找一个刚好在第i个栅栏的左右边界下面的栅栏。如图所示&#xff1a; 则有&#xff1a; f[i][0] min(f[k][0] |Left[i] - Left[…

小程序沉浸式_古北水镇红叶祭嵌入戏精学院 全新文旅沉浸模式让游客嗨起来...

2020年10月17日-24日&#xff0c;古北水镇第二届红叶祭火热来袭。今年除了“超级漫展二次元度假”的模式&#xff0c;古北水镇与顶级沉浸互动体验运营方——INX戏精学院合作&#xff0c;在深度体验空间的同时&#xff0c;加入了互动式的实景游戏体验&#xff0c;通过演员互动&a…

又拍云刘平阳,理性竞争下的技术品牌提升之道

云服务市场趋渐平稳&#xff0c;在这种情况下&#xff0c;就需要通过对某一项技术的深入应用来实现服务的精致化。同时&#xff0c;对品牌的打造和包装也必不可少。\\又拍云在2010年开始提供云服务&#xff0c;经过多年的发展&#xff0c;以及市场策略的转变&#xff0c;决定对…

iOS开发简单高效的数据存储

在iOS开发过程中&#xff0c;不管是做什么应用&#xff0c;都会碰到数据保存的问题&#xff0c;你是用什么方法来持久保存数据的&#xff1f;这是在几乎每一次关于iOS技术的交流或讨论都会被提到的问题&#xff0c;而且大家对这个问题的热情持续高涨。本文主要从概念上把“数据…

回滚机制_【巨杉数据库SequoiaDB】巨杉 Tech | 并发性与锁机制解析与实践

01概述数据库是一个多用户使用的共享资源。当多个用户并发地存取数据时&#xff0c;在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据&#xff0c;破坏数据库的一致性。加锁是实现数据库并发控制的一个非常重要的技术。…

Android系统源码学习——源码目录结构介绍

2019独角兽企业重金招聘Python工程师标准>>> Android 4.0源码目录结构: 本文介绍Android源码目录结构&#xff0c;以便读者理清Android编译系统核心代码在Android源代码的位置。 Android源码体积非常庞大&#xff0c;由Dalvik虚拟机、Linux内核、编译系统、框架代码…

简答题c语言文件操作顺序,计算机基础与程序设计2012年4月真题试题(02275)

计算机基础与程序设计2012年4月真题试题与答案解析(02275)计算机基础与程序设计2012年4月真题试题与答案解析(02275)&#xff0c;本试卷总共100分。一、单项选择题(本大题共20小题.每小题1分&#xff0c;共20分)在每小题列出的四个备选项中只有一个是符合题目要求的&#xff0c…

汇编实验3

1.运行如下代码&#xff1a; assume cs:codecode segment mov ah,2 mov dl,3 add dl,30h int 21h mov ah,2 mov dl,6 add dl,30h int 21h mov ah,4ch int 21hcode endsend 进行汇编运行之后结果为&#xff1a; 将第四行和第九行的寄存器dl的值修改之后代码如下&#xff1a; a…

听了一堂《**学院》的课,我也是醉了

这还是首席讲师的ppt&#xff0c;这说话咋感觉&#xff0c;不像是技术出身&#xff0c;反倒是MongoDB的销售人员呢。 这说话&#xff0c;不大讲相对&#xff0c;净他妈的 绝对&#xff0c;这水平&#xff0c;我真醉了。 这牛逼吹得&#xff0c;啧啧啧。 我还是看书吧。 转载于:…

appium 环境搭建(不推荐安装此版本appium,推荐安装appium desktop)

一&#xff1a;安装node.js 1、双击这个软件 2、一键安装&#xff0c;全都下一步&#xff0c;不要私自更改安装路径 3、打开cmd&#xff0c;输入npm&#xff0c;出现如下截图表示成功 二&#xff1a;安装appium 1、双击appium-installer.exe 2、一键安装&#xff0c;全都下一步…

二级c语言上机题库及解析,2013年计算机二级C语言上机题库及答案解析(3)

填空题给定程序中&#xff0c;函数fun的功能是:在形参ss所指字符串数组中&#xff0c;查找含有形参substr所指子串的所有字符串并输出&#xff0c;若没找到则输出相应信息。ss所指字符串数组中共有N个字符串&#xff0c;且串长小于M。程序中库函数strstr(s1, s2)的功能是在 s1串…

js 数组遍历符合条件跳出循环体_C++模拟面试:从数组“紧凑”操作说开来

面试官自来也去掉一个字符串中的空格。假设用C语言来解答&#xff0c;字符串是char数组。O(n)时间复杂度实现不难&#xff0c;比如额外申请一个新数组&#xff0c;然后遍历一遍字符串&#xff0c;将符合条件的字符存储到新数组中&#xff0c;实现起来很简单。但这显然不能让面试…

基本入门程序编写格式和注意事项

在安装好JDK后联系程序的基本写法。1、先创建记事本&#xff0c;如果有超级记事本如:notepad、ultraedit、editplus等更好。重命名把记事本后面的后缀名改为.java 但是值得注意的是要看看自己创建的记事本文档是否是隐藏后缀名的。要是有设置隐藏的就取消隐藏&#xff0c;以免混…

.dll文件存在但是不显示_一招巧妙解决U盘内文件明明存在,打开U盘而内容却不显示的问题...

大家可能都遇到过这种情况&#xff0c;就是说U盘中明明有文件&#xff0c;但是插在电脑上就是什么文件都没有&#xff0c;一片空白&#xff0c;这样的问题对于那些对文件很重要且仅保存了1份的人来说是很.kongbu.&#xff0c;因为U盘中的内容都是命根子。给大家介绍绝对有用的解…

Vue 框架-05-动态绑定 css 样式

Vue 框架-05-动态绑定 css 样式 今天的小实例是关于 Vue 框架动态绑定 css 样式&#xff0c;这也是非常常用的一个部分 首先说一下 动态绑定&#xff0c;相对的大家都知道静态绑定&#xff0c;静态绑定的话&#xff0c;直接加 class“”就可以了&#xff0c;使用 Vue 呢之前也介…

bool查询原理 es_ES系列之原理copy_to用好了这么香

写在前面Elasticsearch(以下简称ES)有个copy_to的功能&#xff0c;之前在一个项目中用到&#xff0c;感觉像是发现了一个神器。这个东西并不是像有些人说的是个语法糖。它用好了不但能提高检索的效率&#xff0c;还可以简化查询语句。基本用法介绍直接上示例。先看看mapping&am…

vnr光学识别怎么打开_干货|指纹锁的指纹识别模块的前世今生,智能锁的指纹识别到底有多智能?...

智能锁现在也有很多叫法&#xff1a;指纹锁、电子锁。可见指纹识别是智能锁的核心功能了&#xff0c;那我们今天来聊聊智能锁的指纹识别模块。指纹识别的历史指纹识别认证的流程指纹识别技术的种类指纹识别的历史早在2000多年前我国古代的人就将指纹用于签订合同和破案了&#…