天行健, 君子以自强不息
Sunny's Blog
Title

高性能建站(5,6,7,8) -- javaScript,css优化

1.使用link标签将样式表放在文档head中

1)为什么要放在head中,为什么不放在页面底部。

回答这个问题之前,根据《高性能网站建设指南》的说法,我还没有亲自测试过,页面样式用import引入或者放到页面底部,页面整体的加载时间是要比样式放在顶部用link引入的方式快的,但是为什么用户感觉是相反的呢,那是因为页面时逐步呈现的,我们的眼睛或是我们的感觉欺骗了我们。现在正式回答这个问题,结合我自己的理解----我们需要知道,浏览器在加载完样式表之前是什么也不会做的,因为浏览器在渲染页面时无法知道每个标签的样式。如果样式表放在页面底部,页面在加载完其他组件后,再加载样式表,这段时间页面会出现白屏现象。这段时间是用户的纯等待时间,没有任何意义。而把样式放在头部浏览器先加载,进而对DOM tree进行渲染,构建render tree,最后只要进行一次重布局就可以了,这个页面是逐步呈现的,用户自然感觉快了。

2)为什么要用link,不用import。

这里我只强调性能上的差别,加载顺序的差别。当一个页面被加载的时候,link引用的CSS会同时被加载,而@import引用的CSS会等到页面全部被下载完再被加载。这就会出现白屏,和把样式表放底下道理是一样的。

2.将脚本移到页面底部

1)什么是并行下载

HTTP1.1 规范建议浏览器从每个主机名并行的下载两个组件,当然浏览器要并行下载几个是可以设置的。但是jser们当然不能依赖用户在浏览器设置,所以常规是用CNAME将组件分别放在对个主机名中。并行也需要开销的,他的优劣取决于你的带宽和cpu速度,并行并不是越多越好。

2)脚本的下载方式

下载脚本时并行是被禁用的,首先js存在前后依赖关系,并行会出错。其次,脚本可能会修改页面内容,浏览器会等待,以确保恰当的布局。所以,对于Javascript来说,因为它在执行过程中会阻塞页面的渲染,所以我们要把它放在页面的结尾。

3.避免css表达式

expression表达式,会影响页面的加载时间,我还没有涉及过,感觉也不需要。

4.使用外部javaScript和css

从纯速度的角度考虑,内联要比外引快,因为http请求的数量明显要少。但是外引有两个好处,一个是可以利用浏览器的缓存机制,另一个是可以代码重用。所以具体问题具体分析,比如按照书中举例,主页就比较适合内联,因为代码重用率低(页面唯一),还有就是如果用户不经常看的页面,比如一个月只需要看一次,那么缓存基本上不怎么用,倒不如内联,让页面加载速度更快一点。

地势坤,君子以厚德载物