edu_web前端技术文

《高性能网站建设指南》读书笔记

2015-06-01  本文已影响1875人  十一不哭

** 性能黄金法则 **

只有10%20%的最终用户响应时间花在了下载HTML文档上。其余的80%90%时间花在了下载页面中的所有组件上。

** 前端处理规则 **

  1. 减少HTTP请求
  1. 使用内容发布网络
  2. 添加Expires头
  3. 压缩组件
  4. 将样式表放在顶部
  5. 将脚本放在底部
  6. 避免CSS表达式
  7. 使用外部JavaScript和CSS
  8. 减少DNS查找
  9. 精简JavaScript
  10. 避免重定向
  11. 移除重复脚本
  12. 配置ETag
  13. 使Ajax可缓存

HTTP相关概念


  • HTTP请求类型:
    GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE

规则笔记


规则1.减少HTTP请求

技术:图片地图、CSS Sprites、内联图片和脚本、样式表的合并。

【图片地图】

图片地图(Image Map):将多个带有链接的图片合并为一张图片,通过图片地图,点击不同位置链接到不同位置。
分类:服务器端图片地图&客户端图片地图(常用)

示例代码(客户端):

<img usemap="#map1" src="/img/example.png">
<map name="map1">
    <area shape="rect" coords="0,0,31,31" href="location1" title="ToLocation1">
    <area shape="rect" coords="0,12,121,213" href="location2" title="ToLocation2">
    ……
    <area shape="rect" coords="141,0,171,31" href="locationN" title="ToLocationN">
</map>

缺点:

  1. 手工完成困难容易出错
  1. 除了矩形之外几乎无法定义其他形状
  2. 通过DHML创建的图片地图无法再IE中工作
【CSS Sprites】

即雪碧图。将多个图片合并成一张图片,通过background-position控制显示。

【内联图片】

使用data:URL模式可以在Web页面中包含图片但无需任何的HTTP请求。
常见的URl模式:http:、ftp:、file:、mailto:、smtp:、pop:、dns:、whois:、finger:、daytime:、news:、urn:。
data:URL模式格式:

data:[<mediatype>][;base64],<data>

data一般被用于内联图片,但它可以用在任何指定URL的地方。
注:不要内联公司logo。做法:CSS将内联图片作为背景,将CSS放在外部样式表中(达到浏览器缓存功能)。
经验:普通图片就不要采用内联图片了,数据量巨大,严重增大HTML文档的大小。

【合并脚本和样式表】

规则2.使用内容发布网络

规则3.添加Expires头

在这一日期/时间之后,响应将被认为是无效的。

Cache-Control:max-age:315360000

注:时间单位为秒

【空缓存VS完整缓存】

使用长久的Expires头

【修订文件名】

为使用户获取更新,将组件的文件名加上版本号。更新文件时修改文件版本号将会使用户重新从服务器上获取组件。

规则4.压缩组件

减小页面大小的方法:

  1. 压缩HTTP响应包(效果最显著)
  2. 删除注释
  3. 缩短URL
Accept-Encoding:gzip,default
【代理缓存】

存在两种方式上的问题:

问题1:

不支持gzip的浏览器先访问了代理服务器,代理服务器转发请求,服务器返回未经压缩的响应包给代理服务器,代理服务器将未经压缩的响应包缓存后转发给该浏览器;
支持gzip的浏览器请求代理服务器,代理服务器发现缓存,直接将缓存的未经压缩的响应包返回给该支持gzip的浏览器。

结果:虽然支持gzip的浏览器收到的是未经压缩的响应包,未提高效率,但最终还能完成基本的请求。

问题2:

支持gizp的浏览器先访问了代理服务器,代理服务器转发请求,服务器返回经过压缩的响应包给代理服务器,代理服务器将经过压缩的响应包缓存后转发给该浏览器;
不支持gzip的浏览器请求代理服务器,代理服务器发现缓存,直接将缓存的经过压缩的响应包返回给该不支持gzip的浏览器。
结果:第二个不支持gzip的浏览器收到的是经过压缩的响应包,无法正常解析。

解决方法:在Web服务器中添加Vary头

Vary:Accept-Encoding

规则5.将样式表放在顶部

违反规则将样式表放在顶部或HEAD标签外,虽然不影响加载组件的时间,但会影响文档呈现效果,这有不同的浏览器决定(白屏或无样式内容闪烁)。

规则6.将脚本放在底部

规则7.避免CSS表达式

规则8.使用外部的JavaScript和CSS

如果要实现主页快速访问且后续网页也能较快使用组件,可以这样:

1.在主页加载完成后下载后续网页所需组件(加载后下载)
2.动态内联(利用Cookie作指示器,如果有缓存,则生成一个使用外链组件的主页,并在主页加载完成后下载后续组件;如果没有缓存,则生成一个使用内联组件的主页,同样在加载完成后下载后续组件)

规则9.减少DNS查找

当客户端的DNS缓存为空(浏览器和操作系统都是)时,DNS查找的数量与Web页面中唯一主机名的数量相等。
建议:将组件分别放到2~4个主机名下(减少主机名潜在减少了组件并行下载的数量)。

规则10.精简JavaScript

从代码中移除不必要的字符,包含注释、不必要的空白字符(空格、换行和制表符)

【混淆】

精简 + 改写函数和变量名
通常目标:增加反向工程难度
缺点:

  • 缺陷:由于混淆更加复杂,混淆过程本身很可能引入错误。

精简JavaScript的工具:JSMin和DojoCompressor(ShrinkSafe)

【精简CSS】

收益通常小于精简JavaScript

优化CSS:

规则11.避免重定向

规则12.移除重复脚本

规则13.配置ETag

ETag是唯一标识了一个组件的一个特定的字符串。

规则14.使Ajax可缓存

应具有长久的Expires头


此篇笔记是我阅读《高性能网站建设指南》这篇文章记录的笔记,写出来与大家共享。
如果需要阅读原文,请下载PDF文档:《高性能网站建设指南》

上一篇下一篇

猜你喜欢

热点阅读