CSS、JS在文档中的位置与前端性能的关系

版权声明:转载需注明来源 https://blog.csdn.net/Xiao_Spring/article/details/79403503

浏览器的解析方式

浏览器解析html页面首先浏览器先下载html,然后在内存中浏览器的渲染引擎(如 chrome 的webkit)把html代码转化成Dom Tree,然后浏览器根据Dom Tree上的Node分析css和Images。

在遇到外部css文件时会停止构建DOM树,转而解析css文件,构建CSSOM树,完成后会继续构建DOM树,同时与已经构建好的DOM树节点共同构建渲染树,并将内容绘制在屏幕上,而这是一个渐进的过程,不会等到DOM树与CSSOM树共同构建好完整的渲染树才会将内容呈现。

在遇到js文件时也会立即停止构建DOM树,启动js引擎解析js脚本,在解析js过程中,会预解析页面的剩余部分,注意:预解析只是会发送请求接受响应并加载文件而不会解析文件内容。

CSS、JS放置的位置

一般来说css放头部js放底部来确保用户至少能早一点看到界面,让网站看起来至少反应快一点,不过如果css稍微有点多了,会让屏幕白屏时间更长。
所以,并不是说把css都放顶部是一个完美的方法,而且有些js必须在页面加载前执行掉。
所以应该是这样,把必须的js和css放顶部,把不那么重要的css和js放底部。

即将引入的文件放到后面。对于自己写的js代码,如果说这些代码要用到正文里的东西,那么也建议写在后面。因为当运行js代码的时候,如果你用到的正文中的某个东西,但是正文没有加载,所以有可能会出错。

JS 和 CSS 在页面中的位置,会影响其他资源(指 img 等非 js 和 css 资源)的加载顺序,究其原因,有三个值得注意的点:

1) JS 有可能会修改 DOM原型的,可能会有 document.write。这意味着,在当前 JS 加载和执行完成前,后续所有资源的下载有可能是没必要的,这是 JS 阻塞后续资源下载的根本原因。

2) JS 的执行有可能依赖最新样式。比如,可能会有 var width = $(‘#id’).width(). 这意味着,JS 代码在执行前,浏览器必须保证在此 JS 之前的所有css(无论外链还是内嵌)都已下载和解析完成。这是 CSS 阻塞后续 JS 执行的根本原因。

3) 现代浏览器很聪明,会进行 prefetch 优化。性能是如此重要,现代浏览器在竞争中,在 UI update 线程之外,还会开启另一个线程,对后续 JS 和 CSS 提前下载(注意,仅提前下载,并不执行)。有了 prefetch 优化,这意味着,在不存在任何阻塞的情况下,理论上 JS 和 CSS 的下载时机都非常优先,和位置无关。

猜你喜欢

转载自blog.csdn.net/Xiao_Spring/article/details/79403503