规则1:减少HTTP请求
1. 图片地图(map)
2. CSS Sprites
3. 内联图片 data:[<mediatype>][;base64],<data>
4. 合并脚本和样式表
规则2:使用内容发布网络(CDN)
规则3:添加Expires头
更新方法:修改链接/组件文件名(比如设置版本号)
规则4:压缩组件(gzip)
规则5:将样式表放在顶部(使用link标签将样式表放在文档head中)
规则6:将脚本放在底部
规则7:避免CSS表达式
(IE:expression【推荐一次性表达式/事件处理器】)
规则8:使用外部JavaScript和CSS
规则9:减少DNS查找
通过keep-alive和较少的域名来减少DNS查找
规则10:精简JavaScript (精简、混淆)
规则11:避免重定向
规则12: 删除重复脚本
规则13:配置ETag(配置或移除ETag)
规则14:使Ajax可缓存
绪言A:
至少有80%的时间花在了显示Web页面上,并且这些时间是花在html文档下载完毕后发生的。
14条规则:
规则1: 减少http请求
方法:
1. 图片地图(Image Map):在一个图片上关联多个url,目标url的选择取决于用户点击了图片上的哪个位置。
图片地图有两种类型:服务器端图片地图(将所有点击提交到同一个目标url,向其传递用户点击的x,y坐标。Web应用程序将该x,y坐标映射为适当的操作)和客户端图片地图(将用户的点击映射到一个操作)。映射通过html的map标签实现。
缺点:在定义图片地图上的区域坐标时,如果采用手工的方式则很难完成且容易出错,而且除了矩形意外无法定义其他星座。通过dhtml创建的图片地图则在ie中无法工作。
2. CSS Sprites
也可以合并图片,但更为灵活。
方法:使用同一个背景图片,然而每个元素有一个不同的类,通过background-position属性指定了CSS Sprites的偏移量:
1 <style type="text/css"> 2 #navbar span { 3 31px; 4 height: 31px; 5 display: inline; 6 float:left; 7 background-image: url(/img/sprite.gif); 8 } 9 .home {background-position: 0 0; margin-right: 4px; margin-left: 4px;} 10 .gifts {background-position: -32px 0; margin-right: 4px;} 11 .cart {background-position: -64px 0; margin-right: 4px;} 12 .settings {background-position: -96px 0; margin-right: 4px;} 13 .help {background-position: -128px 0; margin-right: 0;} 14 </style> 15 16 <div id="navbar" style=" border: 2px ridge #333; 180px; height: 32px; padding: 4px 0 4px 0"> 17 <a href="javascript:alert('Home')"><span class="home"></span></a> 18 <a href="javascript:alert('Gifts')"><span class="gifts"></span></a> 19 <a href="javascript:alert('Cart')"><span class="cart"></span></a> 20 <a href="javascript:alert('Settings')"><span class="settings"></span></a> 21 <a href="javascript:alert('Help')"><span class="help"></span></a> 22 </div>
CSS Sprites还可以通过合并图片减少http请求,还降低了下载量。虽然会有人任务合并后的图片会比分离的图片总和要大,因为合并的图片中包含有附加的空白区域。实际上,合并后的图片会比分离的图片总和要小,因为它降低了图片自身的开销(颜色表,格式信息等)
3. 内联图片
data:[<mediatype>][;base64],<data>
通过使用data:URL模式可以在Web页面中包含图片但无需任何额外的http请求。IE还不支持。同时可能存在数据大小上的限制。
由于data:URL是内联在页面中的,在跨越不同页面时不会被缓存,所以不要去内联公司logo
4. 合并脚本和样式表
规则2: 使用内容发布网络(CDN,Content Delivery Network)
如果应用程序Web服务器离用户更近,则一个http请求的响应时间将缩短。另一方面,如果组件Web服务器离用户更近,则多个http请求的响应时间将缩短。
概念:
CDN是一组分布在多个不同地理位置的Web服务器,用于更加有效地向用户发布内容。
优点:
1) 可缩短响应时间
2) 有助于缓和Web流量峰值压力
缺点:
1) 响应时间可能会受到其他网站的影响。因为CDN服务提供商在其所有客户之间共享Web服务器组。
2) 无法直接控制组件服务器所带来的特殊麻烦。
CDN用于发布静态内容,比如图片、脚本、样式表和Flash。提供动态html页面会引入特殊的存储需求-----数据库连接,状态管理,验证,硬件和OS优化等。这些复杂性超过了CDN的能力范围。另一方面,静态文件更容易存储并具有较少的依赖性。
规则3: 添加Expires头
【Expires: Thu,15 Apr 2010 20:00:00 GMT】
作用:
规则4: 压缩组件
代理缓存服务器是一个中间层,位于客户端和服务器之间。使用代理缓存的情况下,浏览器将不直接与服务器通信,而是通过代理发送请求。这种情况下,压缩就要考虑额外的东西了。
首先,假设到达代理的是一个来自不支持gzip的浏览器的请求,代理会将请求转发到web服务器,此时web服务器的响应是未经过压缩的,这个响应会把代理服务器缓存起来并发给浏览器。现在,假设到达代理的第二个请求来自一个支持gzip浏览器,请求的是与之前相同的URL,代理会直接使用未经压缩的缓存响应,那么久失去了进行压缩的机会了。考虑更糟糕的情况,第一个请求来自支持gzip的浏览器,第二个请求来自不支持gzip的浏览器,这样第二个请求得到的缓存响应将无法被解码,导致出错。
解决这一问题的方法就是在Web服务器的响应中添加Vary头,Vary:Accept-Encoding,表示web服务器告诉缓存服务器分别为每一个Accpet-Encoding请求头缓存。在前面的例子中,代理通过识别Vary头,对响应缓存不同的版本,避免出错。
规则5: 将样式表放在顶部(使用Link标签将样式表放在文档head中)
规则6: 将脚本放在底部
规则7: 避免css表达式
规则8: 使用外部JavaSript和CSS
规则9: 减少DNS查找(通过使用Keep-Alive和较少的域名来减少DNS查找)
规则10: 精简JavaScript
规则11: 避免重定向
1 300 Multiple Choices (基于Content-type) 2 301 Moved Permancently 3 302 Moved Temporarity(亦作Found) 4 303 See Other(对302的说明) 5 304 Not Modified 并非真的重定向,用来响应条件GET请求,避免下载已经存在于浏览器缓存中的数据 6 305 Use Proxy 7 306 (不再使用) 8 307 Temporary Redirect(对302的说明)
重定向之外的选择:
1. 一种重定向的发生情况:url的结尾必须出现斜线(/)而没有出现时。
当主机名后缺少结尾斜线时是不会发生重定向的
2. 用于:1)将旧url转移到新url,通过重定向整合代码库;2)将一个网站的不同部分连接起来,以及基于一些条件(浏览器类型、用户账号类型等)来引导用户
替代方法:
1)Alias, mod_rewrite和DirectorySlash要求除url外还要提交到一个接口(处理器或文件名),但是易于实现
2)如果两个后端位于同一台服务器上,则它们的代码可能能够自己连接。利于,旧的处理器代码可以通过编程调用新的处理器代码
3)如果域名变了,可以使用一个CNAME(一条DNS记录,用于创建从一个域名指向另一个域名的别名)让两个主机名指向相同的服务器。如果能做到这一点,这里提到的技术(Alias、mod_rewrite、DirectorySlash和直接连接代码)就是可行的。
3. 用于跟踪内部流量: 重定向常用于跟踪用户流量的流向。
替代方法:
使用Referer日志来跟踪流量去向。(内部流量)
4. 跟踪出站流量
替代方法:
1)使用信标(beacon)
2)使用XMLHttpRequest
5. 美化url:使用重定向使得url更加美观并易于记忆
使用alias, mod_rewrite, DirectorySlash和直接链接代码来避免重定向