高性能网站建设指南
# 规则1 减少HTTP请求
性能黄金法则:只有10%~20%的最好中用户响应时间花在接受所请求的HTML文档上。剩下的80%~90%时间花在为HTML文档所引用的所有组件(图片、脚本、样式表、Flash) 等。
- 图片地图 (Image Maps)
img定义图形、map定义图像地图、area定义图像地图中可点击区域
# css优化
- css sprites
- 内联图片
- 合并脚本和样式表
# 规则2 使用内容分发网络 (cdn)
# 规则3 添加Expires头
今天的web页面都包含了大量的组件,并且其数量在不断增长。页面的初访者会进行很多HTTP请求,单通过一个长久的Expiresto头,可以使这些组件被缓存
# Max-Age 和 mode_expires
HTTP1.1引入了Cache-Control头来客服Expires头的限制,因为Expires头使用一个特定的时间,它要求服务器和客户端的始终严格同步。另外,过期的日期需要经常检查,并且一旦未来这一天到来了,还要在服务器配置中提供一个新的日期。
'
# 规则4 压缩组件
Accept-Encoding头来表示对压缩的支持。 e.g:Accept-Encoding: gzip, deflate
使用代理服务器缓存 Vary:Accept-Encoding,User-Agent
google禁止代理缓存:Cache-Control: private
# 规则5 将样式表放在顶部
样式表放在html的底部会导致白屏,演示地址:http://stevesouders.com/hpws/css-bottom.php 这样逐步呈现被禁止了。是一种不好的用户体验。
为了避免白屏,请将样式表放到文档顶部的HEAD中,这样做页面是逐步呈现的,演示地址:
http://stevesouders.com/hpws/css-top.php
LINK标签替代@import还能带来性能上的收益,@import规则有可能会导致白屏现象
使用@import规则会导致组件下载时的无序性,尽管他是放在文档顶部的HEAD中,样式表依然是最后下载的。结果就产生了白屏
# 无样式内容的闪烁的原因大致为:
- 使用import方法导入样式表
- 将样式表放在页面底部
- 有几个样式表,放在html结构的不同位置
解决方法: 使用link标签将样式表放在文档head中
# 规则6 将脚本放在底部
在使用样式表时,页面的逐步呈现会被阻塞,知道所有的样式表下载完成。这就是最好将样式表放在文档的HEAD中的原因,这样就能首先下载他们而不会阻止页面呈现。使用脚本时,对于所有位于脚本一下的内容,逐步呈现都被阻塞了。将脚本放在页面越靠下的地方,以为着越多的内容能够逐步地呈现。
并行下载: HTTP1.1建议浏览器从每个主机名并行地下载两个组件。
# 规则7 避免css表达式
例如:
background-color: expression((new Date()).getHours()%2 ? ‘#fff’:’#ccc')
# 规则8 使用外部javascript 和 css
使用外部javascript和css文件,浏览器就能缓存他们,HTML文档的大小减少,而且不会增加HTTP请求的数量
如果你可以找到一个平衡点,实现较高的重用度,则讲javascript和css部署到外部文件的论据更加强势一些。如果冲拥堵很低,还是内联更有意义一些
一个两全其美的方法就是 加载后下载,在这些页面中,javascript和css被加载到页面中两次。妖气能够工作,必须处理双重定义。例如脚本,可以定义但不能执行任何函数,将组建放到一个不可见的iframe中是一个更好的方式。
动态内联 使用后台语言添加
# 规则9 减少DNS查找
DNS是URL和他们的实际宿主服务器之间的一个间接层。DNS讲主机名映射到IP地址上
# DNS 缓存和TTL
在用户请求了一个主机名之后,DNS信息会留在操作系统的DNS缓存中(windows上的DNS Client服务) TTL值表明记录可以被缓存多久 DnsCacheTimeout KeepAliveTimeout ServerInfoTimeout
当客户端的DNS缓存为空时,DNS查找的数量与web页面中唯一主机名的数量相等。减少唯一主机名的数量就可以减少DNS查找数量.这方面的优秀示例是Google,它的页面只需要一次DNS查找。
通过使用keep-alive和较少的域名来减少DNS查找
# 规则10 精简JavaScript
混淆
它也会一出注释和空白,同时他也会改写代码。作为改写的一部分,函数的变量的名字将被转换为更短的字符串,这时的代码更加精炼,也更难阅读。节省
JSMin Dojo Compressor
# 规则11 避免重定向
# 规则12 删除重复脚本
# 规则13 配置ETag
原始服务器通通过Last-modified响应头来返回组件的最新修改日期
下一次请求中,浏览器会使用If-Modified-Since头将最新修改日期传回原始服务器进行比较。如果匹配,则会返回一个304相应,而不会传送字节数据。实体标签
Etag提供另外一种方式,用于检测浏览器缓存中的组件与原始服务器上的组件是否匹配。Etag世艺个唯一标识了一个组件的特定版本的字符串。唯一格式约束是该字符串必须使用引号引起来。例如: ETag: “10c24bc-4ab-457c1c1f”。此后如果浏览器必须验证一个组件,它会使用If-None-Match头将ETag传回原始服务器。如果ETag是匹配的,就会返回304状态码。ETag带来的问题
通常使用组件的某些属性来构造它,这些属性对于特定的,寄宿了网站的服务器来说是唯一的。当浏览器从一台服务器上获取了原始组件,之后,又向另外一台不同的服务器发起条件get请求时,ETag是不会匹配的。 最后的结果是,对于完全相同的组件,从一台服务器到另一台,Apache和IIS都产生的ETag是不会匹配的。如果ETag不匹配,用户就不会按照ETag设计计划那样接受到更小更快的304响应;相反,他们接收到普通的200响应以及组件的所有数据。 ETag还降低了代理缓存的效率。代理后面用户缓存的ETag经常喝代理缓存的ETag不匹配,这导致不必要的请求被发送到服务器。 If-None_Match比If-Modified-Since具有更高的优先级