跳至主要内容

高性能网页开发新20条规则详解

上个月,Yahoo!优异性能(Yahoo!'s Exceptional Performance)开发团队成员 Stoyan Stefanov 出席了蒙特利尔的2008魁北克PHP会议演讲。他提供了他们团队最新的研究成果和提高网页性能规则20条。在早先的高性能网页开发14条军规已经让大家 耳熟能详,此次新增的20条更加全面,覆盖了服务器端、cookies、页面内容、JavaScript、CSS、图片、移动手机应用这七大类别。以下内 容就是根据这二十条结合个人在实际开发中的理解所做的全面解读。希望对大家开发有所助益。


阅读指导:

1. 每条规则后会指明是针对上述所说的七大类别中哪个类别的优化。

2. 文中提到的一些工具在文后附注中会提供简要说明。

3. 文中经常提到"组件"这个词,这个词不同于我们程序开发中常提到的组件概念。本文中提到的"组件"特指嵌在HTML页面中图片、JavaScript脚本、CSS等静态文件。

一、尽早清除缓冲区[服务器端]

    假如用户请求一个页面,而这个页面在后端服务器需要花200至500毫秒乃至更长时间才能生成最终HTML页面,这时候用户浏览器处于较长时间的、等待页 面数据返回的空闲状态,用户体验不会很好。此时可以根据页面内容长短做适当分隔,将先生成的页面局部HTML缓冲内容提前发送到客户端,不必让服务器消耗 内存缓冲完整个庞大的页面内容后再行输出。这种方法有益于处理后端负荷大而前端负荷轻的页面。

    在HTML页面的head标签位置后是清除缓冲的好位置,因为HTML的head标签可以包括 CSS 和 JavaScript 文件,对于浏览器而言获取页面显示与后端服务器处理并行的效果较好。在PHP中有一个函数 flush(),它可以发送请求页面的局部HTML代码给浏览器,以便浏览器能先取得页面已经生成的部分HTML,同时后端服务器继续忙于处理生成页面余 下的HTML。以下以此函数做个示例:


... <!-- css, js -->

</head>

<!-- 注意此处flush()是放在了head标签位置后面 -->

<?php flush(); ?>

<body>

... <!-- content -->


    其他语言也有类似语法,如ASP.NET和ASP中的 Response.Flush()。

    注意:在实际Web开发中,尽量减少HTTP请求次数是优化的重要方面,这条基本原则是早先14条和新增20条中很多规则的制订基础,实际上它也是14条 规则中第一条也是非常重要的一条规则,但是使用尽早清除缓冲语句会增加一个页面的HTTP请求次数,这无疑是一个矛盾,因此请注意本条规则的适用范围,不 要滥用它。

二、使用GET方法的AJAX请求[服务器端]

    这个容易理解一些。AJAX经常要用XMLHttpRequest,但是它的POST方法在浏览器中完成需要执行两步:首先发送信息头,然后才是发送数据;而GET方法只用一个TCP数据包传递(cookies信息例外)即可,减少了一个步骤,速度会快些。

    另外根据HTTP规范,GET方法就是为获取信息而生的。因此仅在请求数据而不是发送数据给服务器端存储时,使用GET方法很有意义。

    要注意的是,IE中URL允许最大允许长度是2K,用GET方法发送数据时注意2K的这个限制。

三、后加载组件[页面内容]

    使用该方法的意义在于:如果某个页面内容丰富多彩的话,在浏览器加载显示它时速度就不会很快。使用后加载组件的方法可以通过延迟加载一些隐藏内容来保证浏览器优先显示初始页面。

    要做到这一点必须仔细观察自己的页面并且问自己:"解释生成一个完整页面,什么部分内容是开始加载时绝对必须显示的?"清楚了这个问题,那么那些余下内容和组件就可以采用后加载方法延迟生成。这样会大大加快页面显示速度。

    这个技巧通常是JavaScript通过处理页面加载时的onload事件完成。例如,使用JavaScript代码和库去执行拖放动态效果操作时,这些 操作可以延迟,因为拖动页面上元素的操作只能等初始页面生成完后才能发生。页面中的隐藏内容也适合用后加载方式,因为只有页面加载完毕用户才能操作决定是 否显示该内容。

    Yahoo!网站的首页内容繁多,观察处于隐藏状态下的内容,这些内容通常在一些选项卡一样的标签页当中,只有点击后才会加载。

    只要明白该规则的优化要点后相信大家可以通过JavaScript做出自己的具体实现。Yahoo!提供了两个用于实现后加载方法的工具:

◆ YUI Image Loader:可以延迟图片显示

◆ YUI Get utility:它可以在页面加载完成后把JavaScript和CSS资源绑定到DOM上去。

    以上的工具是Yahoo!的YUI库提供。

四、预加载组件[页面内容]

    从文字上看预加载组件与后加载组件似乎作用相反,但实际上二者目标是完全不同的。通过预先加载组件可以充分利用浏览器的空闲时间,并且可以请求未来页面需 要的组件。在这种情况下,当用户访问下一个页面时,你已经提前让大多数组件保存在缓存中,用户加载这个页面就会非常快。

    预加载类型有下列三种:


1. 无条件预加载

    onload事件一触发,就要马上取回一些指定的组件。可以检查google.com首页中onload事件中请求Sprite图片的例子(注:什么是Sprite图片,请参看第十六条规则)。在这个例子可以看出这个sprite图片www.google.com/images/nav_logo3.pnggoogle.com首页本身并不需要, 但它会在随后用户搜索生成的结果页面中需要。


 

2. 条件预加载

    根据用户操作预测用户下一步操作的方向,并据此做预加载。例如,search.yahoo.com中,在输入框中刚键入几个字符后,就会看到页面对你键入的词做出合理推测,推出几个可能要搜索的实际关键词。此方法目前谷歌(google.cn)也在使用。

 

3. 提前预加载

    在将重新设计的网站页面发布前用此法较好。页面重新设计后常会有这样的反馈:"新站点太酷了,就是比以前慢"。原因在于用户访问旧站点是全缓存的,但新站 点还没有缓存过。这时可以在发布新设计前就预加载一些新站点组件,这可以减少没有缓存的副作用。可以利用用户访问旧站点时浏览器空闲的时间请求新站点要使 用的图片、脚本等。

五、减少 DOM 元素数量[页面内容]

    一个复杂的页面意味着要请求下载的字节数更多,也意味着用JavaScript访问DOM速度更慢。

    如何尽量减少已有页面的 DOM 元素数量呢?一个重要的思路就是不要滥用表格table和div 。很多人习惯用一些网页编辑软件去设计页面,这样会导致大量嵌套的表格或在使用语义不合法的标记。使用div要仅当它在语义上有意义时才使用它,有些开发 者使用它仅仅是因为它可以被浏览器解释生成一个新行。

    Yahoo! 提供了一个避免这些问题的方法——使用YUI CSS工具。grids.css 有助于整体布局设计,fonts.css 和 reset.css 有且于清除浏览器的默认格式设置。这些工具可以在Yahoo!的YUI页面中去找。

    DOM元素的数量可在Firebug的Console上键入 document.getElementsByTagName('*').length 得到。

    DOM 元素不超过多少才适当呢?这可以通过检查一些有良好设计的页面来感觉比较。如Yahoo! 主页访问量相当大,它的数量在700个元素(HTML标签)以下。

六、分隔组件到多个域中[页面内容]

    对终端用户响应时间影响最大的就是所请求页面所含组件数量。只要浏览器缓存为空,下载每个组件需要占用额外的HTTP请求,只有缓存满时才可能不占用。

    HTTP/1.1规范中建议浏览器对每一个主机名允许并发下载两个组件。默认状态下,Internet Explorer和Firefox都符合这个规范。注意:IE8.0默认允许6个并发请求。

    许多网页中所有组件都从同一主机名中下载,这时不仅响应时间受并发线程数限制,同时也受该服务器CPU和带宽限制。把页面组件分布在两个主机名中,整体响应时间就会快2倍,CPU和带宽消耗也会得以分担。

七、尽量减少 HTML 标签 iframe 的使用数[页面内容]

    iframe允许在父文档内插入一个HTML文档。要想高效使用iframes,理解它的工作方式很重要。

    使用iframe有如下好处:

◆ 有助于减慢显示第三方标记和广告内容。

◆ 是个安全的 Sandbox。

◆ 能并发下载脚本。

但同时也有弊端:

◆ 即使iframe 内的 HTML 文档内容为空,消耗也比较高。

◆ 会阻止页面的onload事件

◆ 非语义的

八、避免404页面[页面内容]

    如果做了一个HTTP请求然后得到一个无用的响应页面,不仅完全不必要而且会降低用户体验。404页面就是在没有发现指定资源时返回的页面。

    一些站点提供了有益的404提示,对用户体验有好处,但这毕竟浪费了服务器资源。当链接一个外部JavaScript文件,而它又出了404错误,这尤其 糟糕。首先,因为这个下载有问题会阻止并发下载;其次,即使有错浏览器仍然会尽力解析404返回的内容,看看有无JavaScript代码,尽力查找里面 可用代码。

评论

此博客中的热门博文

面试二代:二逼大猜谜

    Sent to you by Gang.Rock via Google Reader:     面试二代:二逼大猜谜 via 译言-精品外文翻译 by rose-tattoo on 11/29/08 译者: rose-tattoo   几年前,微软发现在资源上出了点乱子,说白了吧,是人力资源上出了乱子。其实是这个样子滴: 招聘的大门常打开,应聘的人也不少来,可是来应聘的人跟岗位怎么看也对不上号啊。于是他们觉得该重新设计面试方法了。          按照老路子,面试就确定俩事儿:一个是这个人能不能胜任工作,二是这个人不能太各色,要能融入组织。微软的面试2。0呢,除了这俩条,还加了一个:冷不丁的给应聘的一个根本不靠谱的问题,甚至是让人摸不找头脑,极其二B的提问,看看他们怎么个反映。         一般来说吧,一个应聘的如果本来就爱玩文字游戏,他(她)在面试的时候也会乐于解答二b问题。换句话说,如果应聘人爱吃烙饼,那他面试的时候也会爱吃。看明白了么?这个大猜谜跟面试程序员跟本他妈的挨不上边儿。       如果你还不知道面试2。0都有什么样的问题,我给你展一眼。   波音747有多重? 有个暗盒子,里面仨灯泡,外面仨开关,线全接好了后盒子只能开一次,你怎么知道那个开关开那个灯? 你和仨人在峡谷里要过一个破桥,你一分钟能过去,另外哪仨人得分别用二,五,十,分钟才能过去。过桥得用手电,你们只有一个,你们怎么才能用最快的时间过去?      其实吧,这样的问题都是扯淡,你要是非用常识和实践方法去解答那就更二了。就拿我来说吧,我肯定过不了这些问题,而且非常有可能答成这个操性:         那我得问问波音公司。。。什么?我不能问他们?啊。。。那我就问图书馆里的人儿,你想啊,他们一天到晚就查书啊,他们就是干这个的啊! 这是谁他妈的弄的破盒子啊?你放心,我肯定能弄好,不过我还没看见这盒子什么样儿呢,你怎么知道我弄不好啊??? 太明显了。我们必须扔...

看看资本主义是如何“充分剥夺”员工的剩余价值的

初中那阵子学的"资本主义如何剥削员工的剩余价值"我一直记忆犹新,老师说:他们通虚伪的福利和看上去不错的工作环境来拉拢员工、掩盖他们的丑陋行为,这 些都是资本家用来更大程度地榨取员工的剩余价值的无耻的方法。当时真是痛恨这些资本家,发誓今后一定要去解放哪些受苦受难的员工,虽然放学回家还不知道有 没有饭吃饱。今天在网上看到一些google的瑞士苏黎世的办公室环境图片,不由得佩服恩师啊,他说得太JB正确了,google就是用如下图的糖衣炮弹 来麻醉他的员工,让员工一辈子被榨取剩余价值。 还是我朝那些在自由落体公司的员工好啊,没有糖衣炮弹的腐蚀、生活在民族大企业的环境里,无论男女都喜欢玩极限运动----自由落体运动。 好了,上图吧!

20余个漂亮的图标包下载

关于图片/图标下载的文章,已经写过很多篇了,比如 科幻壁纸下载 和 Firefox性感壁纸 等等。那些图标或壁纸都十分漂亮,让人爱不释手。 今天从 Smashing Magazine 看到了一组难以置信那么漂亮的图标。这些图标包含两部分,一部分是网页设计之用,另一部分是文件的图标。 用以网页设计的图标 1、 Bagg & Box Telecharger Icon Pack 70个高质量的免费图标,全部遵循CC协议,自由取用。 2、 Mammoth Icons 4个非常可爱的小象图标,用以装饰博客也许不错。 3、 Dino Icons 有象怎能没有恐龙呢?这是6个漂亮的恐龙图标,那头暴龙也太可爱了吧? 4、 Cemagraphics Icons 这个网站提供大量的图标,比如下面展示的这些,图像格式为png和ico,大小分别为512px, 256px, 128px, 64px and 32px。   5、 Wifun Icons 一些网站导航图标。 6、 City Icons City Icon包里包含16个高像素的城市生活图标。              7、 Irish Icon Pack 26个爱尔兰风格的图标。 8、 Simpsons Mail Icons 阿森一族的邮票图标,如果你喜欢,还可以在这里 制作你的阿森一族头像 。 9、 Knob Buttons Toolbar Icons 39个与工具栏和导航相关的图标。 10、 Monofactor Free Vector Icon Set 同样也是工具栏和导航的图标,但相对上面的来说更漂亮一些。 11、 Polaroid Icon 人造偏光板? 12、 Apple Mail Icons 含有苹果邮戳的邮票图标。 13、 Sticky Pack 38个很黄不暴力的图标。 14、 Feedicons 2 33个别具风格的Feed图标。 15、 Users Icon Set 11个用户功能图标,有点像WLM那个小绿人。 16、 RSS-icons 这组F...