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

来源:互联网 发布:华为数据 编辑:程序博客网 时间:2024/06/06 15:41
Q: 问这个问题之前,我先说一下浏览器的解析方式,浏览器解析html页面首先浏览器先下载html,然后在内存中把html代码转化成Dom Tree,
然后浏览器根据Dom Tree上的Node分析css和Images,当文档下载遇到js时,js独立下载。
那为什么还要将引用的外部js放在下面,外部css放在上面?(浏览器会有自己的解析顺序)
仅仅是一种良好的编码习惯吗?还是的确会对性能有好处?好处体现在哪些方面?
顺便问一下,有些知名网站的首页会把所有的js和css都写在html的head中,这又是一种什么现象?他们的考虑点在哪里?

A1:
js是阻塞加载,会影响页面加载的速度,如果js文件比较大,算法也比较复杂的话,影响更大。
CSS放在前端是页面渲染时首先是根据DOM结构生成一个DOM树然后加上CSS样式生成一个渲染树,如果CSS放在后面可能页面会出现闪跳的感觉,
或者是白屏或者布局混乱样式很丑直到CSS加载完成。

js非阻塞加载解决方案也有 
1是用defer标签
2是用createElement来动态生成,但是这样有一个问题就是加载顺序在IE下不一定会是按代码写的顺序来加载,可能会影响到依赖项,
有些文件就是必须在另一个文件前引用。火狐跟opera是按顺序加载的
3是用ajax加载,也是非阻塞似的但是这种方法不支持CDN  

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

所以应该是这样,把必须的js和css放顶部,把不那么重要的css和js放底部。  
A3:

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 的下载时机都非常优先,和位置无关。 

A4:
如果在head里有javascript文件,那么必须是先要把这些文件都下载,解析,然后执行之后,程序才会继续往下走。这样势必会影响速度。
所以有一种方法是加defer这个属性。这个属性的用途是表明脚本在执行时不会影响页面的构造。也就是说,脚本会被延迟到整个页面都解析完毕后再运行。
但采用这种方法,会有一种缺陷。在有些浏览器中。并不会按照你自己文件的顺序执行下来。并且有的浏览器还会忽略这种属性。
所以最好不要采用这样的方法。所以个人推荐将引入的文件放到后面。对于自己写的js代码,如果说这些代码要用到正文里的东西,
那么也建议写在后面。因为当运行js代码的时候,如果你用到的正文中的某个东西,但是正文没有加载,所以有可能会出错。
但在现实中,更多的时候我们是采用事件驱动这种形式。所以这样的问题不会太大。主要还是速度。放在后面,速度可能更快。  

0 0