您的位置:首页 > 运维架构 > 网站架构

提高网站访问速度的34条军规二 (转)

2011-03-28 18:00 281 查看

元素的数量(ReducetheNumberofDOMElements)

tag:content

复杂的页面意味着更多的字节需要被下载而且也意味着在JavaScript中遍历DOM更慢。比如你在页面中添加一个事件,让它在500或者5000个DOM元素中循环,它们的效率是不同的。

更多的DOM元素表明有些标签需要被改良而并不一定需要移除实际内容。你是否为了布局而使用繁琐的网一样的表格?你是否只是为了弥补一些布局的问题而使用了更多的div标签?也许还有更好和更符合语义的标签可以使用。

YUICSSutilities可以很好的帮助进行布局:grid.css可以帮助你进行所有的布局,front.css和reset.css可以帮助你去除浏览器默认的格式。这是你开始重新审视你的标签的机会,比如只在语义符合时使用div标签,而不是用它来另起一行。

DOM元素的数量很好检测,只要在Firebug的控制台里输入:
document.getElementsByTagName('*').length

那么多少DOM元素算多呢?查看下类似的使用较好的标签的页面。比如Yahoo!HomePage是一个很丰富的页面但只有700以下的DOM元素(HTML标签)。

20分域部署部件:SplitComponentsAcrossDomains

tag:内容

将部件分割能使你获得最大的并行下载效率。但你同时需要注意不使用多于2~4个域名,以避免DNS查询导致的问题。例如,你可以将HTML内容和动态的组建放于www.example.org域名下,将静态组件分别放于static1.example.org和static2.example.org之下。

查看TenniTheurer和PattyChi的"MaximizingParallelDownloadsintheCarpoolLane"获取更多关于并行下载的信息。

21减少Iframe的数量MinimizetheNumberofiframes

tag:内容

Iframes能够使HTML文档被插入进父级文档中。首先需要明确iframe的工作方式,才能有效的利用这一形式。

<iframe>的优点:

对于第三方内容,比如广告,能够在不影响父级设计的情况下快捷插入。

提供安全沙箱,不影响父级。

能够并行下载脚本。

<iframe>的缺点:

即使是空的也会有消耗。

会锁住页面的onload事件。

不支持语义表达。

22避免404错误No404s

tag:内容

一个获得没用的404响应的HTTP请求对于宝贵的HTTP请求资源来说是完全不必要的,而且这样还会减慢用户的体验。

有的网站提供了有帮助的404错误信息,比如"你是否在寻找……?",这样虽然能提高用户体验,但同样浪费了服务端资源(比如数据库)。尤其不妙的是在请求一个外部的Javascript脚本文件失败时获得的一个404错误,因为这样不但会堵塞并行的下载,而且浏览器会尝试分析404响应的内容,来辨识它是否是有用的Javascript代码。

23减少Cookie的大小ReduceCookieSize

tag:cookie

有多种理由让我们应用HTTPcookie,比如身份验证,或者个性化设置。Cookie中的信息在服务端和浏览器间被放在HTTP头中交换。尽量减少cookie的体积对减少用户获得响应的时间十分重要。

查看TenniTheurer和PattyChi的"WhentheCookieCrumbles"获取更多信息。

去除不必要的cookie。

尽量减少cookie的大小。

留心将cookie设置在适当的域名下,避免影响到其他网站。

设置适当的过期时间。一个较早的过期时间或者不设置过期时间会更快的删除cookie,从而减少用户的响应时间。

24为部件使用没有cookie的域名UseCookie-freeDomainsforComponents

tag:cookie

当浏览其请求一个静态图片并一同发送cookie时,服务器并不需要这些cookie。这样只是毫无益处的创建了多余的网络流量。应当保证静态的部件在请求时没有携带cookie,所以需要把你的静态部件放在另一个子域名下。

如果你的域名是www.example.org,你可以将你的静态部件放在static.example.org中。如果你把cookie设置在顶级域名example.org上而不是www.example.org,那么所有发送至static.example.org的请求会包括那些cookie。在这种情况下,你可以买一个全新的没有cookie的域名来放置你的静态部件。Yahoo!使用了yimg.com,YouTube试用了ytimg.com,Amazon使用的是images-amazon.com。

将静态部件放于没有cookie的域名下的另一个好处是一些代理服务器会拒绝缓存有cookie的部件。于此相关的一点是,如果你怀疑你应该为你的首页使用example.org还是www.example.org,考虑cookie的赢下。省略www会让你不得不把cookie写到*.example.org下,所以考虑性能,最好使用www.子域名,然后把cookie写到这个子域名下。

25减少DOM的读取MinimizeDOMAccess

tag:javascript

利用Javascript读取DOM元素很慢,所以为了获得响应更快的页面,你应该:

缓存被读取的元素的引用。

脱机更新节点然后把它们加回到树结构中。

避免利用Javascript定位布局。

查看JulienLecomte的"HighPerformanceAjaxApplications"获得更多信息。

26开发灵巧的事件处理程序DevelopSmartEventHandlers

tag:javascript

如果有太多的事件处理逻辑部署在DOM树的不同元素上,它们的频繁执行会拖慢页面的响应速度。而使用事件委托是一个好的解决方法。如果在一个Div中有10个按钮,与其在每个按钮上都放一个事件处理程序,步入只在Div上放一个事件处理程序。事件会冒泡上溯,这样你就会捕获这一事件,并找出是哪个按钮发起的它。

同样,你并不需要等待onload事件来启动一些操作DOM树的程序。你只需要保证你需要操作的元素可用就可以了。你不需要等待所有的图片下载完毕,你应当使用DOMContentLoaded事件来替代onload事件,当然,目前并不是所有浏览器都支持这一事件,你可以使用YUIEvent组件,其中包含了一个
onAvailable
函数。

查看JulienLecomte的"HighPerformanceAjaxApplications"获取更多信息。

27选择<link>而不是@importChoose<link>over@import

tag:css

前面提到把CSS应当放在最顶端来提供预显。在IE中,放在页面底部的@import和<link>效果是一样的,所以最好不要用它。

28不使用过滤器AvoidFilters

tag:css

IE专有的
AlphaImageLoader
过滤器是为了解决半透明真色PNG图片在IE7之前的版本中显示的问题。这个过滤器会在图片下载时堵塞住展示。而且它会消耗内存并影响每个元素而不仅仅是每张图片,所以这个过滤器的问题很多。

所以最好在IE中完全不使用AlphaImageLoader过滤器,而使用渐淡的PNG8图片。如果你明确需要AlphaImageLoader,请使用hack_filter,从而不影响到你的IE7+的用户。


29优化图片
OptimizeImages

tag:images

当设计师制作好网站的图片后,还有些事情应该是你在把这些图片上传到服务器之前做的。

你可以检查GIF图片中的调色板是否和图片中的色彩数一致。使用imagemagick来帮助你方便的检查:
identify-verboseimage.gif
如果你看到一个4色的图片却有一个256色的调色板,那么还有很大的空间来做性能优化。

试试把GIF转换成PNG是否会节省空间,这是常有的事情。由于浏览器支持的限制,开发者往往怀疑是否该使用PNG,但这是过去的事情了。唯一的问题是真色的PNG图片的半透明问题,但同样,GIF不是真色的而且也不支持丰富的透明效果。所以GIF可以做的,PNG或者PNG8同样可以做到(除了动画)。一条简单的imagemagick语句就可以提供可用的PNG:
convertimage.gifimage.png
“我们强调的是,给PNG一个机会!”


使用pngcrush或者任何的PNG优化工具,例如:
pngcrushimage.png-remalla-reduce-bruteresult.png


使用jpegtran处理JPEG图片。这个工具会无损操作JPEG图片,比如旋转,而且可以用来优化图片,比如去除图片中的注释和其他无用的信息(比如EXIF信息)。
jpegtran-copynone-optimize-perfectsrc.jpgdest.jpg


30优化CSS精灵OptimizeCSSSprites

tag:images

横向布局Sprite中的图片往往比纵向布局会减少文件大小。

在一个Sprite中组合相近的颜色会降低颜色的数量,从而达到适合PNG8的低于256色的标准。

“对移动设备友好”,不在Sprite里留下大的空隙。这并不十分影响文件的大小,但会减少客户端代理将图片解压为像素映射的内存消耗,100*100的图片是一万像素,而1000*1000则是一百万像素。

31不要在HTML中缩放图片Don'tScaleImagesinHTML

tag:images

不要使用大小超过需要的图片,即使你能够在HTML中设置它的属性。如果你需要

<imgwidth="100"height="100"src="mycat.jpg"alt="MyCat"/>



那么就使用恰好100*100px的图片,而不是使用缩放后的500*500的图片。


32使用小的可缓存的Favicon.icoMakefavicon.icoSmallandCacheable

tag:images

favicon.icon是放在服务器根目录的一个图片,它是个麻烦却不得不处理,因为即使你不关心,浏览器依然会请求这张图片,所以最好不要提供一个404的错误。而且由于它是在同一服务器下的,Cookie也会随着每次请求一并发送。这张图片同样干扰下载队列,比如在IE中,当你在onload事件中请求额外的组件时,favicon会在这些额外组件之前下载。

所以为了减少favicon.ico的不利影响,我们应当:

使用小图片,小于1k为佳。

设置你认为合适的过期时间(因为你如果更新了图片,你并不能修改它的名字)。你可以设置过期为未来的几个月。你可以借鉴下你当前的favicon.ico的最后更新时间来作为设置依据。

Imagemagick能够帮助你创建小图片。

33保证组件大小小于25KKeepComponentsunder25K

tag:mobile

这一限制是因为iPone不会缓存大于25K的组件,注意这里指的是未压缩前的大小。这就是为什么缩小大小很重要,因为单单gzip并不足够。

查看WayneShea和TenniTheurer的"PerformanceResearch,Part5:iPhoneCacheability-MakingitStick"获取更多信息。

34把组件打包进多部分文档中PackComponentsintoaMultipartDocument

tag:mobile

把组件打包进多部分文档类似一封包含有附件的邮件,它能让你通过一个HTTP请求获取多个组件(记住HTTP请求是很昂贵的)。当你使用这一技术,请先检查客户端是否支持它(iPone不支持)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: