CSS对于呈现页面至关重要-浏览器在找到、下载和解析所有CSS之前不会开始呈现-因此我们必须尽快将其加载到用户的设备上。关键路径上的任何延迟都会影响我们的“开始渲染”并给用户留下空白屏幕。有什么大不了的?从广义上讲,这就是CSS对性能至关重要的原因:在构建渲染树之前,浏览器无法渲染页面;渲染树是DOM和CSSOM的组合结果;DOM是HTML加上任何需要操纵JavaScript的阻塞;CSSOM是针对DOM应用的所有CSS规则;JavaScript很容易通过async和defer属性实现非阻塞;CSS不容易异步;所以要记住一个很好的经验法则,你的页面将在加载样式表后以最慢的速度显示。考虑到这一点,我们需要尽快构建DOM和CSSOM。在大多数情况下,构建DOM相对较快:您的第一个HTML响应是一个DOM。然而,由于CSS几乎总是HTML的子资源,因此构建CSSOM通常需要更长的时间。在这篇文章中,我想看看CSS如何证明是网络上的一个重大瓶颈(通过其自身和其他资源)以及我们如何缓解它,从而缩短关键路径并减少开始渲染的时间。使用CriticalCSS如果有办法,减少StartRender时间的最有效方法之一是使用CriticalCSS模式:确定StartRender所需的所有样式(通常是首屏所需的样式),以及将它们内联到
中文档的将产生这个瀑布图:CausedbyinvalidpreloadscannerFirefoxloosesparallelization(注:同样的瀑布出现在IE/Edge中。)这个问题的直接解决方案是交换varscript=document.createElement('script');script.src="analytics.js";document.getElementsByTagName('head')[0].appendChild(script);是所有浏览器中有意且预期的迷人行为,但我从未见过一个理解它的开发人员。当您考虑到它可能带来的巨大性能影响时,这是非常令人惊讶的:如果当前有任何CSS加载,浏览器将不会执行console.log("我不会运行,直到slow-loading-stylesheet.css下载完成。");这是设计使然。这是故意的。当前正在下载任何CSS时,HTML中的任何同步可能询问页面样式的边缘情况:如果脚本在CSS到达并被解析之前询问页面的颜色,那么JavaScript给我们的答案可能不正确或陈旧。为了缓解这种情况,浏览器在构造CSSOM之前不会执行varscript=document.createElement('script');script.src="analytics.js";document.getElementsByTagName('head')[0].appendChild(script);根据这个序列,我们可以清楚地看到,在CSSOM构建之前,JavaScript文件甚至没有开始下载。我们完全失去了任何并行化:在异步代码部分之前有一个样式表会破坏我们并行化的机会。有趣的是,PreloadScanner期望提前引用analytics.js,但我们无意中隐藏了它:“analytics.js”是一个字符串,在<!-通常可能是净亏损。事实上,GoogleAnalytics甚至告诉我们该怎么做,他们是对的:复制此代码并将其粘贴为您要跟踪的每个网页的中的第一项。所以我的建议是:如果您的块不依赖于CSS,请将它们放在样式表之上。下面是当我们切换到这个模式时会发生什么: