这篇文章源于公司内部的一次交流分享活动,选的主题都是些本身不了解的知识,而后经过学习研究再和同事分享。之因此选择本身不了解的知识,也是为了督促本身学习进步,而相应的因本人水平有限且初初接触,文章中可能会存在某些不严谨的或者不正确的地方,望各位大神批评指正。原本定的主题是“预加载”,由于不了解,因此一再追本溯源,最后竟成了这关于浏览器渲染与阻塞的文章。css
浏览器有许多模块,其中负责呈现页面的是渲染引擎模块,下图为Webkit渲染流程:html
虽然不一样浏览器内核渲染细节有所不一样,但基本思路类似:node
DOM和CSSOM是独立的数据结构,其解析是两个并行的进程,所以CSS加载不会阻塞DOM的解析。web
DOM树和CSSOM树的构建过程相似,下图为DOM树的构建过程:面试
字节 → 字符 → 令牌 → 节点 → 对象模型浏览器
下图为渲染树的生成过程:bash
注意,渲染树只包含渲染网页所需的节点微信
原文: zhuanlan.zhihu.com/p/24944905用一句话归纳就是: JS 全阻塞,CSS 半阻塞。
数据结构
- JS 会阻塞后续 DOM 解析以及其它资源(如 CSS,JS 或图片资源)的加载。
- CSS 不会阻塞后续 DOM 结构的解析,不会阻塞其它资源(如图片)的加载,可是会阻塞 JS 文件的加载。
- 现代浏览器很聪明,会进行 prefetch 优化,浏览器在得到 html 文档以后会对页面上引用的资源进行提早下载。(注意仅仅只是提早下载)
这是关于”阻塞“我精读的第一篇文章,当初吸引个人一是归纳得很通俗易懂(如上),二是提供了一种实验方式,这种方式很便于经过实验增强对阻塞的理解,更是我第一次写Node.js。dom
下图是实验的运行方式,前提是已经装了node。
文章中的实验很简单,分析的也颇有道理的样子,我觉得这一篇就能帮我搞定对”阻塞“的理解。然而,问题来了,看着实验结果,有点懵,感受”阻塞“更难懂了。下图为文章demo的实验结果:
看了实验结果,感受跟文章中的结论对不上啊,下面是我产生的一系列疑问:
带着疑惑我将index.html中的代码作了以下修改,主要是按咱们更常见的方式将<link><script>标签放在<head>标签里:
<head>
<script src="/yellow.js"></script> <!--5s-->
<link rel="stylesheet" href="/red.css"> <!--15s-->
<script src="/blue.js"></script> <!--10s-->
<link rel="stylesheet" href="/green.css"> <!--20s-->
</head>
<body>
<p>First Line</p>
<p>Second Line</p>
<p>Third Line</p>
<p>Fourth Line</p>
<p>Fifth Line</p>
</body>复制代码
document.body.style.cssText = "background: blue !important";复制代码
实验现象:
实验分析:
结合实验2的实验现象,和期间对相关资料的阅读学习,对实验1所在文章中的一些说法和实验现象说说个人理解。
由于以前的js代码都是经过link标签引入的,这里实验3就直接将执行代码写进<script>标签里,但实际上,结果是同样的。不少事情,只要明白原理,那么就会一通百通啦~
<head>
<link rel="stylesheet" href="/red.css"><!-- wait="15s"-->
<script>
console.log('hello')
</script>
</head>复制代码
经过实验3能够看出CSS阻塞了js的执行,那么这是为何呢?
个人拙见,其实和JS阻塞DOM解析是出于相同的考虑——为了不冲突。JS阻塞DOM解析的缘由相信各位都知道,而JS代码不只能够操做DOM节点,也能够操做CSSOM上的节点,所以也应该不能同时进行,要等到CSS加载完成。一样的,JS执行也会阻止CSSOM的解析。可能有人会有点绕不明白,DOM解析和JS互斥执行时是JS阻塞了DOM解析,为何CSSOM这里确是CSS阻塞了JS?个人理解HTML解析是至上而下的,其生效顺序也是至上而下、后者覆盖前者,而不是下载完成顺序,所以要等被阻塞JS的前面的CSS解析完才能执行,后面的就没必要管了。
1)<head>里
3)其余(一些学来的知识点,只有结论,没作实验):
关键渲染路径及其优化是个比较复杂的问题,感兴趣的朋友们能够点这里。
举个简单的HTML+1个JS文件+1个CSS文件的例子以下:
上图关键路径特性为:
研究了这么多,固然是但愿可以加快首屏加载速度,这里从减小阻塞和优化关键三要素的角度提出一些优化建议。
<link href="print.css" rel="stylesheet" media="print">
<link href="other.css" rel="stylesheet" media="(min-width: 40em)">复制代码
功能很强大的样子,推荐你们看这里,已经写得很详细了。