我一直在阅读谷歌开发者文档,了解如何优化网页性能。但是,我对其中使用的术语有点困惑。CSS 和 JavaScript 文件都会阻塞 DOM 构建。但是,CSS 被称为“渲染阻塞”,而 JavaScript 被称为“解析器阻塞”。那么,“解析器阻塞”和“渲染阻塞”的术语有什么区别吗?还是它们指的是同样的事情,只是用词上有所不同?
我一直在阅读谷歌开发者文档,了解如何优化网页性能。但是,我对其中使用的术语有点困惑。CSS 和 JavaScript 文件都会阻塞 DOM 构建。但是,CSS 被称为“渲染阻塞”,而 JavaScript 被称为“解析器阻塞”。那么,“解析器阻塞”和“渲染阻塞”的术语有什么区别吗?还是它们指的是同样的事情,只是用词上有所不同?
<script src="...">
元素。解析器看到第一个元素后,必须停止*解析,同时获取并执行javascript,因为它可能包含 document.write()
方法调用,这会根本改变随后的标记解析方式。与浏览器执行的其他任务相比,通过互联网获取资源要慢得多,因此,解析器无事可做,只能等待。最终JS到达,执行完成后,解析器才能继续。然后它看到第二个 <script src="...">
标签,并且必须再次等待资源加载完成。这是一个按顺序进行的过程,这就是解析器阻塞。CSS的渲染阻塞不会阻止DOM的构建,它只会阻止内容显示/渲染直到CSSOM准备就绪。但有一个特殊情况需要注意:
如果在外部CSS的<link>
标签下有任何内联的<script>
,即使那只是一个不包含任何JavaScript的空的<script>
标签,HTML中在该<script>
标签下方的DOM构建仍然会被阻止直到外部的CSS被获取。如果你的网络连接较慢,那个空的<script>
仍然会导致DOM构建的长时间延迟。因为<script>
标签等待外部CSS,而DOM构建则等待这个脚本。在这种情况下,外部CSS资源隐式地导致解析阻塞。
<html>
<body>
<h1 style="color:red"> I will be displayed on the screen and I will be RED</h1>
<link rel="stylesheet" href="styles.css">
<h2> Every elementfrom this point forward (including me) will wait for the CSS to load first and then be displayed on the screen</h2>
</body>
</html>
注意:我应该提到我在这里所做的被视为不良实践。