深入了解CSS和网络性能

本篇文章带大家了解一下css网络性能。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。

深入了解CSS和网络性能

可以提高网络性能:

深入了解CSS和网络性能 var script = document.createElement(‘script’); script.src = “analytics.js”; document.getElementsByTagName(‘head’)[0].appendChild(script);

从下面的瀑布图可以看到,JavaScript 文件在 CSSOM 构建完成之后才开始下载,完全失去了并行下载的优势:

深入了解CSS和网络性能

深入了解CSS和网络性能

交换位置之后,子资源可以并行下载,页面的整体性能提高了两倍以上。(译者注:本节的内容只同意一半, 中的代码,确实是建议先放 ,再放 ,后文也会有相关的内容,但第三方代码放在 中的第一项,取决于相关代码的用途。如非必要,放在页面末尾或空闲时下载及执行也未尝不可)

将无需查询 CSSOM 的 JavaScript 代码放在 CSS 文件之前,需要查询的放在 CSS 文件之后

这条建议远比你想象中的有用。

上文讨论了插入新 的代码应放在 之前,那是否能推广到其他的 CSS 与 JavaScript 呢?为了弄明白这个问题,先提出以下假设:

假设:

CSSOM 的构建会阻塞 CSS 后面同步 JS 的执行;同步的 JS 会阻塞 DOM 的构建…

那如果 JS 并不依赖 CSSOM,以下那种情况会更快?

script 在前 style 在后;style 在前 script 在后?

答案是:

如果 JS 文件没有依赖 CSS,你应该将 JS 代码放在样式表之前。 既然没有依赖,那就没有任何理由阻塞 JavaScript 代码的执行。

(尽管执行 JavaScript 代码时会停止解析 DOM, 但预加载扫描器会提前下载之后的 CSS)

如果你一部分 JavaScript 需要依赖 CSS 而另一部分却不用,最佳的实践是将 JavaScript 分为两部分,分别置于 CSS 的两侧:

根据这种组织方式,我们的页面会按最佳的方式下载与执行相关代码。下面的截图中,粉色代表 JS 的执行,但它们都比较“纤细”了,希望你能看得清楚。(第一栏的(下同))第一行是整个页面的时间轴,留意该行粉色的部分,代表 JS 正在执行。第二行是首个 JS 文件的时间轴,可以看到下载完后并立即执行。第三行是 CSS 的时间轴,因而没有任何 JS 执行。最后一行是第二个 JS 文件的时间轴,可以清晰地看到,直到 CSS 下载完成后才执行。

深入了解CSS和网络性能

注意,你应该根据页面的实际情况测试这种代码组织方式,取决于 CSS 与 JavaScript 文件大小与 JavaScript 文件执行所需的时间,可能会出现不同的结果。记得多测试!(译者注:根据实践经验, 中的代码组织基本可以按照这种方式,即 JS 在 CSS 之前,因为 中的 JS 代码基本不依赖 CSS,唯一的反例是 JS 代码体积非常大或执行时间很长。)

放在 中。

最后一条优化策略比较新颖,它对页面性能有很大帮助,并使页面达到逐步渲染的效果,同时易于执行。

在 HTTP/1.1 中,我们习惯于将全部的 css 打成一个文件,如 app.css:

      

...

...

然而,从三方面而言,渲染性能降低了:

每个页面只用到 app.css 中的部分样式: 用户会下载多余的 CSS。

难以制定缓存策略: 例如,某个页面使用的日期选择器更改了背景颜色,重新生成 app.css 后,旧的 app.css 缓存将失效。

整个 app.css 在解析构建完 CSSOM 之前,页面渲染被阻塞: 尽管当前页面可能只用到了 17% 的 CSS代码,但(浏览器)仍需等待其他 83% 的代码下载并解析完后,才能开始渲染。

使用 HTTP/2,可以解决第一与第二点:

                      

...

...

根据页面的不同组件下载不同的 CSS,能有效地解决冗余问题。这减少了对关键路径造成阻塞的 CSS 文件总大小。

同时,我们可以制定更有效的缓存策略,(当代码产生变化之后,)只会影响对应文件的缓存,其他的文件保持不变。

但仍有解决的问题:下载并解析全部 CSS 文件之前,页面的渲染仍然是阻塞的。页面的渲染时间仍然取决于最慢的 CSS 文件下载与解析的时间。假设由于某种原因,页脚的 CSS 下载需要很长时间,(即使页头的 CSSOM 已经构建完成,)浏览器也只能等待而无法渲染页头。

然而,这现象在 Chrome (v69)中得到缓解,Firefox 与 IE/Edge 也已经进行了相关的优化。 只会阻塞后续内容,而不是整个页面的渲染。这意味着我们可以用以下方式组织代码:

          

...

...

这样的结果是我们能逐步渲染页面,当前面的 CSS 可用时,页面将呈现对应的内容(,而不需等待全部 CSS 下载并解析完毕)。

I如果浏览器不支持这种特性,也不会损害页面的性能。整个页面将回退为原来的模式,只有在最慢的 CSS 下载并解析完成后,才能渲染页面。

有关这种特性的更多细节,建议阅读这篇文章。

总结

本文内容比较 繁杂,成文后超出了本来的预期,尝试总结了 CSS 加载相关的一系列的最佳实践,值得仔细体会:

懒加载非关键 CSS:优先加载关键 CSS,懒加载其他 CSS;或根据媒体类型拆分 CSS 文件。避免使用 @import:在 HTML 文档中应该避免;在 CSS 文件之中更应避免;以及警惕预加载扫描器的怪异行为。关注 CSS 与 JavaScript 的顺序:在 CSS 文件后的 JavaScript 仅在 CSSOM 构建完成后才会执行;如果你的 JavaScript 不依赖 CSS;将它放置于 CSS 之前;如果 JavaScript 依赖 CSS:将它放置于 CSS 之后。仅加载 DOM 依赖的 CSS:这将提高初次渲染的速度使让页面逐步渲染。

注意

本文叙述的内容都遵循规范或根据浏览器的行为推导得出,然而,你应该亲自进行测试。尽管理论上是正确的,但在实践中可能会有所不同。记得好好测试!

英文原文地址:https://csswizardry.com/2018/11/css-and-network-performance/

更多编程相关知识,请访问:编程视频!!

以上就是深入了解CSS和网络性能的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1620411.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫

关于作者

上一篇 2025年12月24日 07:08:19
下一篇 2025年12月24日 07:08:33

相关推荐

发表回复

登录后才能评论
关注微信