CSS、JS 放置位置与前端性能的关系?

问这个问题之前,我先说一下浏览器的解析方式,浏览器解析html页面首先浏览器先下载html,然后在内存中把html代码转化成Dom Tree,然后浏览器根据Dom Tree上的Node分析css和Images,当文档下载遇到js时,js独立下载。 那为什么还要将引用的外部js放在下面,外部css放在上面?(浏览器会有自己的解析顺序) 仅仅是一种良好的编码习惯吗?还是的确会对性能有好处?好处体现在哪些方面? 顺便问一下,有些知名网站的首页会把所有的j…
关注者
80
被浏览
7276

7 个回答

js是阻塞加载,会影响页面加载的速度,如果js文件比较大,算法也比较复杂的话,影响更大。
CSS放在前端是页面渲染时首先是根据DOM结构生成一个DOM树然后加上CSS样式生成一个渲染树,如果CSS放在后面可能页面会出现闪跳的感觉,或者是白屏或者布局混乱样式很丑直到CSS加载完成。
js非阻塞加载解决方案也有
1是用defer标签
2是用createElement来动态生成,但是这样有一个问题就是加载顺序在IE下不一定会是按代码写的顺序来加载,可能会影响到依赖项,有些文件就是必须在另一个文件前引用。火狐跟opera是按顺序加载的
3是用ajax加载,也是非阻塞似的但是这种方法不支持CDN

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 的下载时机都非常优先,和位置无关。
  4. 以上不是我写的,是我印象笔记里的一段,具体链接在哪我也找不到了