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

现在让我们看看浏览器从网络上加载资源所耗费的时间(我们忽略从缓存以及从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,一经查实,立即删除!

相关文章

引入 javascript_在您JavaScript项目中引入类型安全性? 再想一想

引入 javascriptby James Wright詹姆斯赖特(James Wright) 在您JavaScript项目中引入类型安全性&#xff1f; 再想一想 (Introducing Type Safety To Your JavaScript Project? Think Again) 更新— 2017年2月1日 (Update — 1st February 2017) I’ve heard various counter…

劣币驱逐良币通俗解释_如何通俗理解劣币驱逐良币的问题,同时如何扭转这个现象?...

以牛奶为例谈劣币驱逐良币。【原来】大家都卖的纯正的纯牛奶&#xff0c;因为。牛奶的来源和生产工艺基本上都差不多&#xff0c;所以说产品的品质也没有什么大的差异。【后来】奶制品企业为了争夺市场开始打价格战&#xff0c;你卖5块我就卖4块&#xff0c;你卖4块我就卖3块5&…

c语言里 如何取得线程的lpparameter'参数,请问线程函数如何访问对话框类中的变量...

我线程函数定义在对话框类的实现文件中需要访问对话框类头文件中声明的变量怎么才可以&#xff1f;i_noname(晚九朝五) 于 2005-9-15 16:14:25DWORD WINAPI Proc(LPVOID lpParameter ){CDialog *pDlg (CDialog *)lpParameter;...}启用线程时把对话框指针传进去AfxBeginThread(…

Android内存优化——内存泄露检测分析方法

上一篇文章总结了一些常见的内存泄露场景及优化方案&#xff0c;这篇文章继续总结内存泄露的一些常用的检测和分析方法。 Lint代码检查 AndroidStudio自动Lint代码检查工具&#xff0c;一些常见的代码警告Lint工具都会给我们提示。使用也比较简单&#xff1a; Analyze —> I…

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…

hackintosh黑苹果_为什么您的下一个Mac应该是Hackintosh?

hackintosh黑苹果by Sebastian Dobrincu塞巴斯蒂安多布林库(Sebastian Dobrincu) 为什么您的下一个Mac应该是Hackintosh&#xff1f; (Why Your Next Mac Should Be a Hackintosh ?) I just finished a 48-hour Hackintosh building marathon. It was a fun experience and I…

一张图解释什么是遗传算法_遗传算法简介及代码详解

(allele)数据值&#xff0c;属性&#xff0c;值基因座(locus)位置&#xff0c;iterator位置表现型(phenotype)参数集&#xff0c;解码结构&#xff0c;候选解染色体&#xff1a;又可以叫做基因型个体(individuals)群体/种群(population)&#xff1a;一定数量的个体组成&#xf…

c语言程序设计学生程序查询,《c语言程序设计报告-学生信息管理系统》.doc

《c语言程序设计报告-学生信息管理系统》中南大学??C语言程序设计实践报告?????题 目 学生信息管理系统学生姓名 张眼指导教师 刘伟荣学 院 信息科学与工程学院专业班级 电气信息1113班完成时间 2012年6月28日星期四?1.设计任务及设计目标学生信息管理系统是基于系统主…

ListString 和 ArrayListString的区别

最近对这两个问题比较懵逼&#xff0c;关于List和ArrayList、List<String> list new ArrayList<String>(); 好了&#xff0c;先搞明白List 和 ArrayList吧。 List是一个接口&#xff0c;是Collection接口的一个子接口&#xff0c;是一个有序的集合。 ArrayList是L…

java城市级联一次查询_我的城市没有任何设计活动,所以我自己组织了一次。...

java城市级联一次查询by Marty Laurita由Marty Laurita 我的城市没有任何设计活动&#xff0c;所以我自己组织了一次。 (There weren’t any design events in my city, so I organized one myself.) “The meeting of two personalities is like the contact of two chemical…

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;大海捞针一般找…

汇编总结2

一、寄存器 一个典型的cpu是由运算器&#xff0c;控制器&#xff0c;寄存器等器件组成的。 内部总线实现CPU内部各个器件之间的联系 外部总线实现cpu和主板上其他器件的联系 AX,BX,CX,DX通用寄存器 SI,DI,BP,SP基址和变址寄存器 CS,SS,DS,ES段寄存器 IP,FLAGS指令指针和标志寄存…

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

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

c语言定时器回调函数的参数,定时器的简单实现即回调函数的运用

&#xfeff;&#xfeff;这两天在 研究回调函数就想实现简单的定时器&#xff0c;如下是鄙人的程序望指教。ios#include #include using namespace std;app#define MAXNUM 256函数typedef void (*timerProcessFunc)(void*);spatypedef struct{unsigned int id;int timeout; /…

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[…

udacity开源的数据_评论:Udacity数据分析师纳米学位计划

udacity开源的数据by David Venturi大卫文图里(David Venturi) 评论&#xff1a;Udacity数据分析师纳米学位计划 (Review: Udacity Data Analyst Nanodegree Program) Udacity’s Data Analyst Nanodegree program was one of the first online data science programs in the …

凌晨四点钟深圳的风景

科比有过一句很励志的故事&#xff1a;凌晨四点钟洛杉矶的风景。 很多人把科比当成榜样&#xff0c;不仅仅因为他精湛的球技&#xff0c;更是因为他远超常人的职业精神。 其实做到这一点&#xff0c;并不难&#xff0c;难的是坚持。坚持那么早时间起床&#xff0c;坚持十年如一…

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

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

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

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

编写代码的工作在哪找_编写事件代码如何帮助我获得了出色的工作

编写代码的工作在哪找Everyone kept telling me about the importance of networking, but it was always something I blew off. I’m pretty quiet and introverted, particularly when meeting strangers. I thought I just wasn’t built for networking.每个人都在不断告诉…