不要忽略了前端的性能
将《高性能网站建设指南》读完了,感觉很好,这本书值得大家一读。让paperen对前端性能优化有了更多了解。steve souders 将所有法则都描述得很彻底,很简洁。书中一些观点更是让paperen深刻“只有10%-20%的最终用户响应时间花在了下载HTML文档上,其余的80%-90%时间花在了下载页面中的所有组件上”,“如果将后端响应时间缩短一半,整体响应时间只能减少5%-10%,如果关注前端性能,同样是将其响应时间减少一半,则整体响应时间可以减少40%-45%”,总结得真的很到位,更重要的是你在阅读过程中会通过例子自己体会到作者这些观点。
光看封面都挺有意思的,留意那只狗的比例。
书中的内容paperen在这里就不打算描述了~~想了解还倒不如自己买本书看看。paperen想倒不如来描述一下详细如何做吧,或者更好一点。
在开始之前建议大家熟悉一下使用浏览器一些装备,opera的Dragonfly,firefox的firebug,chrome的开发人员工具resources,IE的自己找吧……(paperen一般不用IE,tip:Dragonfly与chrome的开发人员工具都可以使用ctrl+shift+i,快速打开)paperen推荐使用firebug,因为可以为firefox安装一个组件很方便地给我们提供建议,组件叫YSlow,直接安装上就可以了,安装时看看能不能与您当前使用的firefox版本兼容就可以了(不兼容就升级firefox咯~)。
但是YSlow是英文版的,对于英文一般的同学可能看得会有点难受,不过也不要紧,慢慢看吧,提高英文水平也是很重要的,特别对于IT这个领域。
YSlow里面的指标确实也不少,paperen不打算全部都解析一遍,毕竟没有那个水平而且还没有研究到那么深~paperen打算就解析一下以下这些,而且这些是最值得我们去改善的方面。
1.Make fewer HTTP requests——减少HTTP请求数量
2.Add Expires headers——添加缓存头
3.Compress components——压缩组件
4.Put CSS at top——将css放在头部
5.Put JavaScript at bottom——将javascript放在底部
6.Avoid CSS expressions——避免css表达式
7.Make JavaScript and CSS external——javascript与css使用外链的方式
8.Minify JavaScript and CSS——javascript与css最小化
9.Remove duplicate JavaScript and CSS——移除重复的javascript与css
10.Configure entity tags (ETags)——配置ETags
11.Make AJAX cacheable——使AJAX可缓存
1.对于第一点减少HTTP请求数量,之前paperen的 关于网站打开速度那点事 也提及到一点点,主要是有关图片的。
如果将图片都单独出来的话那么这里三张图片就是三次HTTP请求,但是如果将图片集在一起那么只有一次HTTP请求,减少了两次,我们可以使用CSS Sprite这种技巧去同时使用同一张图片但显示不同区域的内容。
CSS Sprite简单来说就是类似于下面这样:
.icon{background:url(image/icons.gif);display:block;position:absolute}
.brainstorm_icon{background-position:-404px -32px;width:27px;height:32px;left:3px;top:7px}
.script_icon{background-position:0 0;width:32px;height:30px;left:0;top:7px}
.apple_icon{background-position:-32px 0;width:26px;height:32px;left:3px;top:5px}
改变backgroun-position就能显示不同区域的内容,当然要限定宽度与高度,在PS或fireworks里面度量时尺寸多大就设定为多大。
2.添加缓存头,这个或者可以说对于第一次浏览者来说没太大作用,这个技巧重要在浏览者之后的重复访问,可以大大地减少数据传送,加快速度。有大部分组件其实是不要时刻重新下载的,例如图片,css,js这些文件其实在第一次下载后,后面若网站没有对这些文件产生改变时其内容是不变的,那没有必要在以后访问时再重新下载一次,影响速度也浪费流量。
如果您服务器提供使用.htaccess文件的话可以在里面加上
<IfModule mod_expires.c>
ExpiresActive on
<FilesMatch ".(gif|jpg|jpeg|png|ico|js|css|ico)$">
ExpiresDefault "access plus 2 weeks"
</FilesMatch>
</IfModule>
关于更多设置可以看看这个 http://www.blogguy.cn/show-752-1.html
加上了关于缓存的配置后在第一次请求回应时,服务器会告诉浏览器该文件的过时日期,如果这个文件在这段时间内没有修改过那么完全可以使用本地缓存的文件而不用重新请求下载该文件,减少重复而无用的工作。注意查看响应头信息的Expires与Last-Modified,还有Cache-Control。建议最好自己动手试试,您会对结果感到满意的,但是有一点需要注意的是,不要为变动大的文件加上缓存配置,可能会得不偿失。
使用缓存后,你可以看到总共215.4KB的数据里面有194.8KB被缓存的,那代表什么,我想您应该明白的!又减轻服务器压力又减少客户流量!
3.关于压缩组件,要确认服务器是否有使用压缩,您可以查看响应头信息是否存在Content-Encoding,一般浏览器请求头部也会声明自己支持哪种压缩,Accept-Encoding gzip, deflate。可以查看上上张图片,不过paperen并没有开启压缩,YSlow也已经提示了,大家想要实现gzip压缩可以在.htaccess文件中加上
Header set Content-Encoding gzip
但使用压缩后的js与css需要进行一些特殊的处理,可以查看一下 这篇文章 ,要对js与css在传送前重定向一下到一个php文件进行一下处理,paperen觉得第一个评论就已经很值得思考,而博主回复得也很到位。
4.将Css放到头部,或者您只需要记住这是一个规则,如果要解析为什么的话,可以查阅一下paperen提到的那本书的规则5,因为这归根于浏览器解析页面的原理。
5.将javascript放到底部,将javascript放在body标记结束之前是最好的做法,正如书中说的“脚本会阻塞对其后面内容的呈现,脚本会阻塞对其后面组件的下载”,如果您将大量的javascript放在头部,这样可能会让浏览者处于一个白屏状态(如果js文件下载得不是很快的话),会让他们觉得慢。
不妨可以看看paperen的关于页面,调用了google地图来显示paperen的位置,结果有时候会让边栏无法显示,因为google的js加载不过去……如果将google地图的js放到body标签结束之前就不会这样了。
6.避免在css中使用表达式,paperen很久之前就有一篇东西用到这个css表达式完美的弹出层,现在paperen倒觉得有点疑问为啥当时会使用完美这个形容词……里面有一条css是这样写的。
_top:expression(eval(document.compatMode && document.compatMode=='CSS1Compat') ? documentElement.scrollTop + (document.documentElement.clientHeight-this.offsetHeight)/2 : document.body.scrollTop + (document.body.clientHeight - this.clientHeight)/2);
OMG!真可够长的,而这样的东西就是css的表达式,要避免或者尽量少用吧。
7.对javascript与css使用外链的方式调用,paperen觉得应该要加上尽量这个形容词吧,因为有些js不能避免的会写到页面上,如果针对一些独特的页面的话,但是总体来说还是建议使用外链的方式,如果是大的项目要将哪些是基本的js分离出来,因为这些基本的js是不会变动频繁的,固能更好地被缓存,而css的话如果实在不是太大,全部写到一个文件好了,如果网站有很多不同的频道而且风格也不是相同,那么就要对css进行一些调整了,把最基本的样式挑离出来单独一个文件,正如处理刚才说的处理js的方法差不多,不同频道就再载入相应的css文件,基本的css再第一次加载后就不会变了,这样还是可以接受的。
8.javascript与css最小化,这里直接放出两个工具吧。JSmin 与 csscompressor ,css那个没什么可提的了,JSmin的使用在网页上已经说得很清楚,只是是英文的。顺便也提一下怎用吧~~为了英文不是很懂的朋友们。
最下面有个Get Minified,点击那个zip file containing an MS-DOS.exe file就可以下载到一个压缩包了,解压后有个exe的(还有个源文件,有兴趣可以看看代码)将jsmin.exe与一个未最小化的js放到您自己觉得方便的目录下,然后打开cmd(就是那个黑屏的控制台),切换到jsmin.exe路径下然后使用以下的命令。
jsmin <fulljslint.js >jslint.js "(c)2002 Douglas Crockford"
这是个原文的例子,fulljslint.js文件就是未最小化之前的js文件,jslint.js则是最小化后的文件,后面双引号的是加入一些注释什么的。(您当然可以配置系统的环境变量来实现不用次次都切换到具体目录就能使用这个命令,在Path中加上您存放jsmin.exe的那个路径就可以了)
9.移除重复的javascript与css,这个其实很明了啦,一个js函数不要同时写两遍,css属性不要有多余的。比如:
h1{font-size:14px;}
h2{font-size:14px;color:#C00;}
h3{font-size:14px;padding-top:10px;}完全可以写成这样
h1,h2,h3{font-size:14px;}
h2{color:#C00;}
h3{fpadding-top:10px;}
10.配置ETags,运用书中的描述就是:“ETag——实体标签(Entity Tag)是Web服务器与浏览器用于确认缓存组件的有效性的一种机制”。如果使用了ETags会在响应头加入一个ETag标记,而下次请求时浏览器会在请求头加入一个if-none-match标记,将ETag重新返回供服务器判断请求文件是否过期,但引用书中的描述是“ETag不会匹配,对于使用服务器集群来处理请求的网站来说,这是很常见的一种情况”,而且if-none-match比if-modified-since具有更高优先级,也就是说即使你配置了缓存策略而且确实文件没有处于需要更新的状态ETag值变了还是要重新下载文件,故paperen的建议是去掉ETag,而书中也提议到调整,但是如何调整就没说。
在.htaccess文件将缓存策略加上两行
<IfModule mod_expires.c>
ExpiresActive on
<FilesMatch ".(gif|jpg|jpeg|png|ico|js|css)$">
Header unset ETag
FileETag None
ExpiresDefault "access plus 2 weeks"
</FilesMatch>
</IfModule>
11.AJAX可缓存,ajax的优化其实都可以运用上述说的一些步骤的,压缩啦,精简js啦,ETag啦~而从ajax的运用上您可以考虑使用的是被动的方式还是主动的方式,比如有些ajax请求是可以在未发生之前就发动的,这些是为了将来而预先发起的,当用户点击某个按钮或者链接时就不需要太多等待就能获取到信息,预加载总是好的,但是得要分清楚哪些需要预加载而哪些不用,不能顾此失彼,做到平衡就很好了。
对了,最后还有个网址分享一下的,关于缓存的 http://www.mnot.net/cache_docs/
流风33 13年前
评论框一直盯着我,我好紧张
回覆TA尔珂 13年前
呵呵,好长时间没看了,这也是新版了,呵呵,更新很快啊,很好!很好![:br]不是,为啥非得填邮箱类,呵呵,就害怕一个框一个框的写字。[:fk]
回覆TA