??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲熟妇av一区二区三区下载,五月天婷亚洲天综合网精品偷,国产精品亚洲va在线观看http://www.tkk7.com/wgodman/category/47393.html看得见的未来zh-cnFri, 17 Dec 2010 03:38:17 GMTFri, 17 Dec 2010 03:38:17 GMT60?web前端面性能优化http://www.tkk7.com/wgodman/articles/340945.html爱品?/dc:creator>爱品?/author>Fri, 17 Dec 2010 00:54:00 GMThttp://www.tkk7.com/wgodman/articles/340945.htmlhttp://www.tkk7.com/wgodman/comments/340945.htmlhttp://www.tkk7.com/wgodman/articles/340945.html#Feedback0http://www.tkk7.com/wgodman/comments/commentRss/340945.htmlhttp://www.tkk7.com/wgodman/services/trackbacks/340945.html本文来自于周裕L的博客,关于更多前台优化的内容可以上他的博客上学?http://www.webchina110.cn/


Yahoo! ?Exceptional Performance 团队?Web 面性能优化带来最佛_践,旨在提高|站性能。Excetional Performance 团队ȝZ一pd可以提高|站速度的方法,可以分ؓ 7 大类 34 条。包括内宏V服务器、Cookie、CSS、JavaScript、图片、移动应用等七部分?/p>

 

Web 面性能优化之内?/p>

1、尽量减?HTTP hơ数

l端用户响应的时间中Q有 80% 用于下蝲各项内容。这部分旉包括下蝲面中的囑փ、样式表、脚本、Flash {。通过减少面中的元素可以减少 HTTP h的次数。这是提高网速度的关键步骤?/p>

减少面lg的方法其实就是简化页面设计。那么有没有一U方法既能保持页面内容的丰富性又能达到加快响应时间的目的呢?q里有几条减?HTTP hơ数同时又可能保持页面内容丰富的技术?/p>

合ƈ文g是通过把所有的脚本攑ֈ一个文件中来减?HTTP h的方法,如可以简单地把所有的 CSS 文g都放入一个样式表中。当脚本或者样式表在不同页面中使用旉要做不同的修改,q可能会相对ȝ点,但即便如此也要把q个Ҏ作ؓ改善面性能的重要一步?/p>

CSS Sprites 是减图像请求的有效Ҏ。把所有的背景囑փ都放C个图片文件中Q然后通过 CSS ?background-image ?background-position 属性来昄囄的不同部分;

囄地图是把多张囄整合C张图片中。虽然文件的M大小不会改变Q但是可以减HTTPhơ数。图片地囑֏有在囄的所有组成部分在面中是紧挨在一L时候才能用,如导航栏。确定图片的坐标和可能会比较J琐且容易出错,同时使用囄地图D也不h可读性,因此不推荐这U方法;

内联囑փ是?data:URL scheme 的方法把囑փ数据加蝲面中。这可能会增加页面的大小。把内联囑փ攑ֈ样式表(可缓存)中可以减?HTTP h同时又避免增加页面文件的大小。但是内联图像现在还没有得到L览器的支持?/p>

减少面?HTTP hơ数是你首先要做的一步。这是改q首ơ访问用L待时间的最重要的方法。如?Tenni Theurer 的他的博?Browser Cahe Usage – Exposed! 中所_HTTP h在无~存情况下占M 40% ?60% 的响应时间。让那些初次讉K你网站的得更加快速的体验吧!

2、减?DNS 查找ơ数

域名pȝQDNSQ提供了域名?IP 的对应关p,像电话本中人名和他们的电话L的关pM栗当你在览器地址栏中输入 www.fufuok.com ӞDNS 解析服务器就会返回这个域名对应的 IP 地址。DNS 解析的过E同样也是需要时间的。一般情况下q回l定域名对应?IP 地址会花?20 ?120 毫秒的时间。而且在这个过E中览器什么都不会做直?DNS 查找完毕?/p>

~存 DNS 查找可以改善面性能。这U缓存需要一个特定的~存服务器,q种服务器一般属于用L ISP 提供商或者本地局域网控制Q但是它同样会在用户使用的计机上生缓存。DNS 信息会保留在操作pȝ?DNS ~存中(微Y Windows pȝ?DNS Client ServiceQ。大多数览器有独立于操作系l以外的自己的缓存。由于浏览器有自q~存记录Q因此在一ơ请求中它不会受到操作系l的影响?/p>

Internet Explorer 默认情况下对 DNS 查找记录的缓存时间ؓ 30 分钟Q它在注册表中的键gؓ DnsCacheTimeout 。Firefox ?DNS 的查找记录缓存时间ؓ 1 分钟Q它在配|文件中的选项?network.dnsCacheExpirationQFasterfox 把这个选项改ؓ?1 时Q?/p>

当客L中的 DNS ~存都ؓI时Q浏览器和操作系l都为空Q,DNS 查找的次数和面中主机名的数量相同。这其中包括面?URL 、图片、脚本文件、样式表、Flash 对象{包含的L名。减主机名的数量可以减?DNS 查找ơ数?/p>

减少L名的数量q可以减页面中q行下蝲的数量。减?DNS 查找ơ数可以节省响应旉Q但是减ƈ行下载却会增加响应时间。我的指导原则是把这些页面中的内容分割成臛_两部分但不超q四部分。这U结果就是在减少 DNS 查找ơ数和保持较高程度ƈ行下载两者之间的权衡了?/p>

3、避免蟩?/p>

跌{是?301 ?302 代码实现的。下面是一个响应代码ؓ 301 ?HTTP _

HTTP/1.1 301 Moved Permanently
Location: http://example.com/demo
Content-Type: text/html

览器会把用h向到 Location 中指定的 URL 。头文g中的所有信息在一ơ蟩转中都是必需的,内容部分可以为空。不他们的名称Q?01 ?302 响应都不会被~存除非增加一个额外的头选项Q如 Expires 或?Cache-Control 来指定它~存?lt;meat /> 元素的刷新标{֒ JavaScript 也可以实?URL 的蟩转,但是如果你必要跌{的时候,最好的Ҏ是使用标准?3XXHTTP 状态代码,q主要是Z保“后退”按钮可以正确C用?/p>

但是要记住蟩转会降低用户体验。在用户?HTML 文中间增加一个蟩转,会拖廉面中所有元素的昄Q因为在 HTML 文g被加载前M文gQ图像、Flash {)都不会被下蝲?/p>

有一U经常被|页开发者忽略却往往十分费响应旉的蟩转现象。这U现象发生在?URL 本该有斜杠(/Q却被忽略掉时。例如,当我们要讉K http://astrology.yahoo.com/astrology Ӟ实际上返回的是一个包?301 代码的蟩转,它指向的?http://astrology.yahoo.com/astrology/ Q注意末斜杠Q。在 Apache 服务器中可以使用 Alias 或?mod_rewrite 或?the DirectorySlash 来避免?/p>

q接新网站和旧网站是跌{功能l常被用到的另一U情c这U情况下往往要连接网站的不同内容然后Ҏ用户的不同类型(如浏览器cd、用戯̎h属类型)来进行蟩转。用蟩转来实现两个|站的切换十分简单,需要的代码量也不多。尽用这U方法对于开发者来说可以降低复杂程度,但是它同样降低用户体验。一个可替代Ҏ是如果两者在同一台服务器上时使用 Alias ?mod_rewrite 和实现。如果是因ؓ域名的不同而采用蟩转,那么可以通过使用 Alias 或?mod_rewirte 建立 CNAMEQ保存一个域名和另外一个域名之间关pȝ DNS 记录Q来替代?/p>

4、可~存的AJAX

Ajax l常被提及的一个好处就是由于其从后台服务器传输信息的异步性而ؓ用户带来的反馈的x性。但是,使用 Ajax q不能保证用户不会在{待异步?JavaScript ?XML 响应上花Ҏ间。在很多应用中,用户是否需要等待响应取决于 Ajax 如何来用。例如,在一个基?Web ?Email 客户端中Q用户必ȝ?Ajax q回W合他们条g的邮件查询结果。记住一点,“异步”q不异味着“x”Q这很重要?/p>

Z提高性能Q优?Ajax 响应是很重要的。提?Ajxa 性能的措施中最重要的方法就是响应h可缓存性,具体的讨论可以查看规则:d Expires ?或?Cache-control ) 。其它的几条规则也同样适用?Ajax Q?/p>

Gizp 压羃文g
减少 DNS 查找ơ数
_ JavaScript
避免跌{
配置 ETags

让我们来看一个例子:一?Web2.0 ?Email 客户端会使用 Ajax 来自动完成对用户地址薄的下蝲。如果用户在上次使用q?Email web 应用E序后没有对地址薄作M的修改,而且 Ajax 响应通过 Expire 或?Cacke-Control 头来实现~存Q那么就可以直接从上一ơ的~存中读取地址薄了。必d知浏览器是用缓存中的地址薄还是发送一个新的请求。这可以通过取地址薄的 Ajax URL 增加一个含有上ơ编辑时间的旉x实现Q例如,&t=11900241612 {。如果地址薄在上次下蝲后没有被~辑q,旉戛_不变Q则从浏览器的缓存中加蝲从而减了一?HTTP hq程。如果用户修改过地址薄,旉戛_会用来确定新?URL 和缓存响应ƈ不匹配,览器就会重要请求更新地址薄?/p>

即你的 Ajxa 响应是动态生成的Q哪怕它只适用于一个用P那么它也应该被缓存v来。这样做可以使你?Web2.0 应用E序更加快捷?/p>

5、推q加载内?/p>

你可以仔l看一下你的网,问问自己“哪些内容是页面呈现时所必需首先加蝲的?哪些内容和结构可以稍后再加蝲Q?/p>

把整个过E按?onload 事g分隔成两部分QJavaScript 是一个理想的选择。例如,如果你有用于实现拖放和动ȝ JavaScript Q那么它׃{待E后加蝲Q因为页面上的拖攑օ素是在初始化呈现之后才发生的。其它的例如隐藏部分的内容(用户操作之后才显现的内容Q和处于折叠部分的图像也可以推迟加蝲?/p>

工具可以节省你的工作量:YUI Image Loader 可以帮你推迟加蝲折叠部分的图片,YUI Get utility 是包?JS ?CSS 的便h法。比如你可以打开 Firebug ?Net 选项卡看一?Yahoo 的首c?/p>

当性能目标和其它网站开发实践一致时׃相得益嘪。这U情况下Q通过E序提高|站性能的方法告诉我们,在支?JavaScript 的情况下Q可以先去除用户体验Q不q这要保证你的网站在没有 JavaScript 也可以正常运行。在定面q行正常后,再加载脚本来实现如拖攑֒动画{更加花哨的效果?/p>

6、预加蝲

预加载和后加载看hg恰恰相反Q但实际上预加蝲是ؓ了实现另外一U目标。预加蝲是在览器空闲时h来可能会用到的面内容Q如囑փ、样式表和脚本)。用这U方法,当用戯讉K下一个页面时Q页面中的内容大部分已经加蝲到缓存中了,因此可以大大改善讉K速度?/p>

下面提供了几U预加蝲ҎQ?/p>

无条件加载:触发 onload 事gӞ直接加蝲额外的页面内宏V以 Google.com ZQ你可以看一下它?spirit image 囑փ是怎样?onload 中加载的。这?spirit image 囑փ?google.com 主页中是不需要的Q但是却可以在搜索结果页面中用到它?/p>

有条件加载:Ҏ用户的操作来有根据地判断用户下面可能d的页面ƈ相应的预加蝲面内容。在 search.yahoo.com 中你可以看到如何在你输入内容时加载额外的面内容?/p>

有预期的加蝲Q蝲入重新设计过的页面时使用预加载。这U情늻常出现在面l过重新设计后用h?#8220;新的面看v来很P但是却比以前?#8221;。问题可能出在用户对于你的旧站点建立了完整的~存Q而对于新站点却没有Q何缓存内宏V因此你可以在访问新站之前就加蝲一部内Ҏ避免q种l果的出现。在你的旧站中利用浏览器的空余时间加载新站中用到的图像的和脚本来提高讉K速度?/p>

7、减?DOM 元素数量

一个复杂的面意味着需要下载更多数据,同时也意味着 JavaScript 遍历 DOM 的效率越慢。比如当你增加一个事件句柄时?500 ?5000 ?DOM 元素中@环效果肯定是不一L?/p>

大量?DOM 元素的存在意味着面中有可以不用U除内容只需要替换元素标{ְ可以_的部分。你在页面布局中用表g吗?你有没有仅仅Z布局而引入更多的 <div> 元素呢?也许会存在一个适合或者在语意是更贴切的标{֏以供你用?/p>

YUI CSS utilities 可以l你的布局带来巨大帮助Qgrids.css 可以帮你实现整体布局Qfont.css ?reset.css 可以帮助你移除浏览器默认格式。它提供了一个重新审视你面中标{ZQ比如只有在语意上有意义时才使用 <div> Q而不是因为它h换行效果才用它?/p>

DOM 元素数量很容易计出来,只需要在 Firebug 的控制台内输入:
document.getElementsByTagName(’*').length

那么多少?DOM 元素是多呢Q这可以对照有很好标C用的cM面。比?Yahoo! 主页是一个内定w常多的页面,但是它只使用?700 个元素(HTML 标签Q?/p>

8、根据域名划分页面内?/p>

把页面内容划分成若干部分可以使你最大限度地实现q下蝲。由?DNS 查找带来的媄响你首先要确保你使用的域名数量在 2 个到 4 个之间。例如,你可以把用到?HTML 内容和动态内Ҏ?www.example.org 上,而把面各种lgQ图片、脚本、CSS)分别存放?statics1.example.org ?statics.example.org 上?/p>

9、 iframe 的数量最?/p>

ifrmae 元素可以在父文档中插入一个新?HTML 文。了?iframe 的工作理然后才能更加有效C用它Q这一点很重要?/p>

<iframe> 的优点:

解决加蝲~慢的第三方内容如图标和q告{的加蝲问题 Security sandbox q行加蝲脚本?/p>

<iframe> 的缺点:

x内容为空Q加载也需要时_会阻止页面加载,没有语意?/p>

10、不要出?404 错误

HTTP h旉消耗是很大的,因此使用 HTTP h来获得一个没有用处的响应Q例?404 没有扑ֈ面Q是完全没有必要的,它只会降低用户体验而不会有一点好处?/p>

有些站点?04错误响应面改ؓ“你是不是要找***”Q这虽然改进了用户体验但是同样也会浪Ҏ务器资源Q如数据库等Q。最p糕的情冉|指向外部 JavaScript 的链接出现问题ƈq回 404 代码。首先,q种加蝲会破坏ƈ行加载;其次览器会把试囑֜q回?404 响应内容中找到可能有用的部分当作 JavaScript 代码来执行?/p>

在本pd的第一节中Q讲了提高网站性能中网?#8220;内容”有关?0条原则。除了在|站在内容上的改q外Q在|站服务器端上也有需要注意和改进的地方,它们包括Q?/p>

使用内容分发|络
为文件头指定 Expires ?Cache-Control
Gzip 压羃文g内容
配置 ETag
早h输出~冲
使用 GET 来完?AJAX h

11、用内容分发网l?/p>

用户与你|站服务器的接近E度会媄响响应时间的长短。把你的|站内容分散到多个、处于不同地域位|的服务器上可以加快下蝲速度。但是首先我们应该做些什么呢Q?/p>

按地域布|网站内容的W一步ƈ不是要尝试重新架构你的网站让他们在分发服务器上正常运行。根据应用的需求来改变|站l构Q这可能会包括一些比较复杂的dQ如在服务器间同?Session 状态和合ƈ数据库更新等。要想羃短用户和内容服务器的距离Q这些架构步骤可能是不可避免的?/p>

要记住,在终端用L响应旉中有 80% ?90% 的响应时间用于下载图像、样式表、脚本、Flash {页面内宏V这是|站性能黄金守则。和重新设计你的 应用E序架构q样比较困难的Q务相比,首先来分布静态内容会更好一炏V这不仅会羃短响应时_而且对于内容分发|络来说它更Ҏ实现?/p>

内容分发|络QContent Delivery NetworkQCDNQ是׃pd分散到各个不同地理位|上?Web 服务器组成的Q它提高了网站内容的传输速度。用于向用户传输内容的服务器主要是根据和用户在网l上的靠q程度来指定的。例如,拥有最网l蟩敎ͼnetwork hopsQ和响应速度最快的服务器会被选定?/p>

一些大型的|络公司拥有自己?CDN Q但是用像 Akamai Technologies QMirror Image Internet Q?或?Limelight Networks q样?CDN 服务成本却非帔R。对于刚刚v步的企业和个人网站来_可能没有使用 CDN 的成本预,但是随着目标用户的不断扩大和更加全球化QCDN 是实现快速响应所必需的了。以 Yahoo 来说Q他们{Ud CDN 上的|站E序静态内容节省了l端用户 20% 以上的响应时间。?CDN 是一个只需要相对简单地修改代码实现显著改善|站讉K速度的方法?/p>

12、ؓ文g头指?Expires ?Cache-Control

q条守则包括两方面的内容Q?/p>

对于静态内容:讄文g头过期时?Expires 的gؓ“Never expire”Q永不过期)?/p>

对于动态内容:使用恰当?Cache-Control 文g头来帮助览器进行有条g的请求?/p>

|页内容设计现在来丰富,q就意味着面中要包含更多的脚本、样式表、图片和 Flash 。第一ơ访问你面的用户就意味着q行多次?HTTP hQ但是通过使用 Expires 文g头就可以使这样内容具有缓存性。它避免了接下来的页面访问中不必要的 HTTP h。Expires 文g头经常用于图像文Ӟ但是应该在所有的内容都用他Q包括脚本、样式表?Flash {?/p>

览器(和代理)使用~存来减?HTTP h的大和ơ数以加快页面访问速度。Web 服务器在 HTTP 响应中?Expires 文g头来告诉客户端内定w要缓存多长时间。下面这个例子是一个较长时间的 Expires 文g_它告诉浏览器q个响应直到2010q??5日才q期?/p>

Expires: Thu, 15 Apr 2010 20:00:00 GMT

如果你用的?Apache 服务器,可以使用 ExpiresDefault 来设定相对当前日期的q期旉。下面这个例子是使用 ExpiresDefault 来设定请求时间后 10 q过期的文g_

ExpiresDefault “access plus 10 years”

要切讎ͼ如果使用?Expires 文g_当页面内Ҏ变时必L变内容的文g名。依 Yahoo! 来说我们l常使用q样的步骤:在内容的文g名中加上版本P?yahoo_2.0.6.js ?/p>

使用 Expires 文g头只有会在用户已l访问过你的|站后才会v作用。当用户首次讉K你的|站时这对减?HTTP hơ数来说是无效的Q因为浏览器的缓存是I的。因此这U方法对于你|站性能的改q情况要依据他们“预缓?#8221;存在时对你页面的点击频率Q?#8220;预缓?#8221;中已l包含了面中的所有内容)。Yahoo! 建立了一套测量方法,我们发现所有的面览量中?75~85% 都有“预缓?#8221;。通过使用 Expires 文g_增加了缓存在览器中内容的数量,q且可以在用h下来的请求中再次使用q些内容Q这甚至都不需要通过用户发送一个字节的h?/p>

13、Gzip 压羃文g内容

|络传输中的 HTTP h和应{时间可以通过前端机制得到显著改善。的,l端用户的带宽、互联网提供者、与对等交换点的靠近E度{都不是|站开发者所能决定的。但是还有其他因素媄响着响应旉。通过减小 HTTP 响应的大可以节?HTTP 响应旉?/p>

?HTTP/1.1 开始,Web 客户端都默认支持 HTTP h中有 Accept-Encoding 文g头的压羃格式Q?/p>

Accept-Encoding: gzip, deflate

如果 Web 服务器在h的文件头中检到上面的代码,׃以客L列出的方式压~响应内宏VWeb 服务器把压羃方式通过响应文g头中?Content-Encoding 来返回给览器?/p>

Content-Encoding: gzip

Gzip 是目前最行也是最有效的压~方式。这是由 GNU 目开发ƈ通过 RFC 1952 来标准化的。另外仅有的一个压~格式是 deflate Q但是它的用范围有限效果也E稍逊色?/p>

Gzip 大概可以减少 70% 的响应规模。目前大U有 90% 通过览器传输的互联|交换支?gzip 格式。如果你使用的是 Apache Qgzip 模块配置和你的版本有养IApache 1.3 使用 mod_zip Q?Apache 2.x 使用 moflate ?/p>

览器和代理都会存在q样的问题:览器期望收到的和实际接收到的内容会存在不匹配的现象。幸好,q种Ҏ情况随着旧式览器用量的减在减少。Apache 模块会通过自动d适当?Vary 响应文g头来避免q种状况的出现?/p>

服务器根据文件类型来选择需要进?gzip 压羃的文Ӟ但是q过于限制了可压~的文g。大多数 Web 服务器会压羃 HTML 文档。对脚本和样式表q行压羃同样也是值得做的事情Q但是很?Web 服务器都没有q个功能。实际上Q压~Q何一个文本类型的响应Q包?XML ?JSON Q都值得的。图像和 PDF 文g׃已经压羃q了所以不能再q行 gzip 压羃。如果试?gizp 压羃q些文g的话不但会浪?CPU 资源q会增加文g的大?/p>

Gzip 压羃所有可能的文gcd是减文件体U增加用户体验的单方法?/p>

14、配|?ETag

Entity tagsQETagsQ(实体标签Q是 Web 服务器和览器用于判断浏览器~存中的内容和服务器中的原始内容是否匚w的一U机Ӟ“实体”是所说的“内容”Q包括图片、脚本、样式表{)。增?ETag 为实体的验证提供了一个比使用“last-modified dateQ上ơ编辑时_”更加灉|的机制。Etag 是一个识别内容版本号的唯一字符丌Ӏ唯一的格式限制就是它必须包含在双引号内。原始服务器通过含有 ETag 文g头的响应指定面内容?ETag ?/p>

HTTP/1.1 200 OK
Last-Modified: Tue, 12 Dec 2006 03:03:59 GMT
ETag: “10c24bc-4ab-457e1c1f”
Content-Length: 12195

E后Q如果浏览器要验证一个文Ӟ它会使用 If-None-Match 文g头来?ETag 传回l原始服务器。在q个例子中,如果 ETag 匚wQ就会返回一?304 状态码Q这p省了 12195 字节的响应?/p>

GET /i/yahoo.gif HTTP/1.1
Host: us.yimg.com
If-Modified-Since: Tue, 12 Dec 2006 03:03:59 GMT
If-None-Match: “10c24bc-4ab-457e1c1f”
HTTP/1.1 304 Not Modified

ETag 的问题在于,它是Ҏ可以辨别|站所在的服务器的h唯一性的属性来生成的。当览器从一台服务器上获得页面内容后到另外一台服务器上进行验证时 ETag ׃不匹配,q种情况对于使用服务器组和处理请求的|站来说是非常常见的。默认情况下QApache ?IIS 都会把数据嵌?ETag 中,q会显著减少多服务器间的文g验证冲突?/p>

Apache 1.3 ?2.x 中的 ETag 格式?inode-size-timestamp 。即使某个文件在不同的服务器上会处于相同的目录下Q文件大、权限、时间戳{都完全相同Q但是在不同服务器上他们的内码也是不同的?/p>

IIS 5.0 ?IIS 6.0 处理 ETag 的机制相伹{IIS 中的 ETag 格式?Filetimestamp:ChangeNumber 。用 ChangeNumber 来跟t?IIS 配置的改变。网站所用的不同 IIS 服务器间 ChangeNumber 也不相同?不同的服务器上的 Apache ?IIS 即对于完全相同的内容生的 ETag 在也不相同,用户q不会接收到一个小而快?304 响应Q相反他们会接收一个正常的 200 响应q下载全部内宏V如果你的网站只攑֜一台服务器上,׃会存在这个问题。但是如果你的网站是架设在多个服务器上,q且使用 Apache ?IIS 产生默认?ETag 配置Q你的用戯得页面就会相Ҏ一点,服务器会传输更多的内容,占用更多的带宽,代理也不会有效地~存你的|站内容。即使你?内容拥有 Expires 文g_无论用户什么时候点?#8220;h”或?#8220;重蝲”按钮都会发送相应的 GET h?/p>

如果你没有?ETag 提供的灵zȝ验证模式Q那么干脆把所有的 ETag 都去掉会更好。Last-Modified 文g头验证是Z内容的时间戳的。去?ETag 文g头会减少响应和下ơ请求中文g的大。微软的q篇支持文稿讲述了如何去?ETag 。在 Apache 中,只需要在配置文g中简单添加下面一行代码就可以了:

FileETag none

15、尽早刷新输出缓?/p>

当用戯求一个页面时Q无论如何都会花?200 ?500 毫秒用于后台l织 HTML 文g。在q期_览器会一直空闲等待数据返回。在 PHP 中,你可以?flush() ҎQ它允许你把已经~译的好的部?HTML 响应文g先发送给览器,q时览器就会可以下载文件中的内容(脚本{)而后台同时处理剩余的 HTML 面。这样做的效果会在后台烦恼或者前台较I闲时更加明显?/p>

输出~冲应用最好的一个地方就是紧跟在 <head /> 之后Q因?HTML 的头部分Ҏ生成而且头部往往包含 CSS ?JavaScript 文gQ这h览器可以在后台~译剩余 HTML 的同时ƈ行下载它们?例子Q?/p>

… <!– css, js –>
</head>
<?php flush(); ?>
<body>
… <!– content –>

Z证明使用q项技术的好处QYahoo! 搜烦率先研究q完成了用户试?/p>

16、?GET 来完?AJAX h

Yahoo!Mail 团队发现Q当使用 XMLHttpRequest Ӟ览器中?POST Ҏ是一?#8220;两步?#8221;的过E:首先发送文件头Q然后才发送数据。因此?GET 最为恰当,因ؓ它只需发送一?TCP 包(除非你有很多 CookiesQ。IE ?URL 的最大长度ؓ 2K Q因此如果你要发送一个超q?2K 的数据时׃能?GET 了?/p>

一个有的不同是 POST q不?GET 那样实际发送数据。根?HTTP 规范QGET 意味着“获取”数据Q因此当你仅仅获取数据时使用 GET 更加有意义(从语意上讲也是如此)Q相反,发送ƈ在服务端保存数据时?POST ?/p>

在第一部分和第二部分中我们分别介绍了改善网站性能中页面内容和服务器的几条守则Q除此之外,JavaScript ?CSS 也是我们面中经常用到的内容Q对它们的优化也提高|站性能的重要方面:

把样式表|于剙
把脚本置于页面底?br /> 避免使用 CSS 表达式(ExpressionQ?br /> 使用外部 JavaScript ?CSS
削减 JavaScript ?CSS
?<link> 代替 @import
避免使用滤镜
剔除重复脚本
减少DOM讉K
开发智能事件处理程?/p>

17、把样式表置于顶?/p>

在研I?Yahoo! 的性能表现Ӟ我们发现把样式表攑ֈ文档?<head /> 内部g会加快页面的下蝲速度。这是因为把样式表放?<head /> 内会佉K面有步骤的加载显C?/p>

注重性能的前端服务器往往希望面有秩序地加蝲。同Ӟ我们也希望浏览器把已l接收到内容可能显C出来。这对于拥有较多内容的页面和|速较慢的用户来说特别重要。向用户q回可视化的反馈Q比如进E指针,已经有了较好的研Iƈ形成了正式文档。在我们的研I中 HTML 面是q程指针。当览器有序地加蝲文g头、导航栏、顶部的 Logo {对于等待页面加载的用户来说都可以作为可视化的反馈。这从整体上改善了用户体验?/p>

把样式表攑֜文底部的问题是在包?Internet Explorer 在内的很多浏览器中这会中止内容的有序呈现。浏览器中止呈现是ؓ了避免样式改变引L面元素重绘。用户不得不面对一个空白页面?/p>

HTML 规范清楚指出样式表要攑֌含在面?<head /> 区域内:“?<a /> 不同Q?lt;link /> 只能出现在文的 <head /> 区域内,管它可以多ơ用它。无论是引v白屏q是出现没有样式化的内容都不值得d试。最好的Ҏ是按照 HTML 规范在文?<head /> 内加载你的样式表?/p>

18、避免?CSS 表达式(ExpressionQ?/p>

CSS 表达式是动态设|?CSS 属性的强大Q但危险Q方法。Internet Explorer 从第5个版本开始支?CSS 表达式。下面的例子中,使用 CSS 表达式可以实现隔一个小时切换一ơ背景颜Ԍ

background-color: expression( (new Date()).getHours()%2 ? “#B8D4FF” : “#F08A00″ );

如上所C,expression 中用了 JavaScript 表达式。CSS 属性根?JavaScript 表达式的计算l果来设|。expression Ҏ在其它浏览器中不起作用,因此在跨览器的设计中单独针?Internet Explorer 讄时会比较有用?/p>

表达式的问题在于它的计频率要比我们想象的多。不仅仅是在面昄和羃放时Q就是在面滚动、乃至移动鼠标时都会要重新计一ơ。给 CSS 表达式增加一个计数器可以跟踪表达式的计算频率。在面中随便移动鼠标都可以L辑ֈ 10000 ơ以上的计算量?/p>

一个减?CSS 表达式计次数的Ҏ是使用一ơ性的表达式,它在W一ơ运行时结果赋l指定的样式属性,q用q个属性来代替 CSS 表达式。如果样式属性必d面周期内动态地改变Q用事件句柄来代替 CSS 表达式是一个可行办法。如果必M?CSS 表达式,一定要C它们要计成千上万次q且可能会对你页面的性能产生影响?/p>

19、用外?JavaScript ?CSS

很多性能规则都是关于如何处理外部文g的。但是,在你采取q些措施前你可能会问C个更基本的问题:JavaScript ?CSS 是应该放在外部文件中呢还是把它们攑֜面本n之内呢?

在实际应用中使用外部文g可以提高面速度Q因?JavaScript ?CSS 文g都能在浏览器中生缓存。内|在 HTML 文中的 JavaScript ?CSS 则会在每ơ请求中?HTML 文重新下蝲。这虽然减少?HTTP h的次敎ͼ却增加了 HTML 文的大。从另一斚w来说Q如果外部文件中?JavaScript ?CSS 被浏览器~存Q在没有增加 HTTP hơ数的同时可以减?HTML 文的大?/p>

关键问题是,外部 JavaScript ?CSS 文g~存的频率和h HTML 文的次数有兟뀂虽然有一定的隑ֺQ但是仍然有一些指标可以一量它。如果一个会话中用户会浏览你|站中的多个面Qƈ且这些页面中会重复用相同的脚本和样式表Q缓存外部文件就会带来更大的益处?/p>

许多|站没有功能建立q些指标。对于这些网站来_最好的Ҏ是?JavaScript ?CSS 作ؓ外部文g引用。比较适合使用内置代码的例外就是网站的主页Q如 Yahoo! 主页?My Yahoo! 。主在一ơ会话中拥有较少Q可能只有一ơ)的浏览量Q你可以发现内置 JavaScript ?CSS 对于l端用户来说会加快响应时间?/p>

对于拥有较大览量的首页来说Q有一U技术可以^衡内|代码带来的 HTTP h减少与通过使用外部文gq行~存带来的好处。其中一个就是在首页中内|?JavaScript ?CSS Q但是在面下蝲完成后动态下载外部文Ӟ在子面中用到q些文gӞ它们已经~存到浏览器了?/p>

20、削?JavaScript ?CSS

_是指从去除代码不必要的字W减文件大从而节省下载时间。消减代码时Q所有的注释、不需要的I白字符Q空根{换行、tab~进Q等都要L。在 JavaScript 中,׃需要下载的文g体积变小了从而节省了响应旉。精 JavaScript 中目前用到的最q泛的两个工h JSMin ?YUI Compressor 。YUI Compressor q可用于_ CSS ?/p>

h是另外一U可用于源代码优化的Ҏ。这U方法要比精复杂一些ƈ且在h的过E更易生问题。在对美国前 10?|站的调查中发现Q精也可以羃原来代码体U的 21% Q而؜淆可以达?25% 。尽؜淆法可以更好地羃减代码,但是对于 JavaScript 来说_的风险更?/p>

除消减外部的脚本和样式表文g外,<script> ?<style> 代码块也可以q且应该q行消减。即使你?Gzip 压羃q脚本和样式表,_q些文g仍然可以节省 5% 以上的空间。由?JavaScript ?CSS 的功能和体积的增加,消减代码会获得益处?/p>

21、用 <link> 代替 @import

前面的最佛_C提到 CSS 应该攄在顶端以利于有序加蝲呈现?/p>

?IE 中,面底部 @import 和?<link> 作用是一LQ因此最好不要用它?/p>

22、避免用o?/p>

IE独有属?AlphaImageLoader 用于修正 7.0 以下版本中显C?PNG 囄的半透明效果。这个o镜的问题在于览器加载图片时它会l止内容的呈现ƈ且冻l浏览器。在每一个元素(不仅仅是囄Q它都会q算一ơ,增加了内存开支,因此它的问题是多斚w的?/p>

完全避免使用 AlphaImageLoader 的最好方法就是?PNG8 格式来代替,q种格式能在IE中很好地工作。如果你实需要?AlphaImageLoader Q请使用下划U?_filter 又之对 IE7 以上版本的用h效?/p>

23、把脚本|于面底部

脚本带来的问题就是它L了页面的q下蝲。HTTP/1.1 规范Q浏览器每个L名的q行下蝲内容不超q两个。如果你的图片放在多个主机名上,你可以在每个q行下蝲中同时下?个以上的文g。但是当下蝲脚本Ӟ览器就不会同时下蝲其它文g了,即便是主机名不相同?/p>

在某些情况下把脚本移到页面底部可能不太容易。比如说Q如果脚本中使用?document.write 来插入页面内容,它就不能被往下移动了。这里可能还会有作用域的问题。很多情况下Q都会遇到这斚w的问题?/p>

一个经常用到的替代Ҏ是使用延迟脚本。DEFER 属性表明脚本中没有包含 document.write Q它告诉览器l显C。不q的是,Firefoxq不支持 DEFER 属性。在 Internet Explorer 中,脚本可能会被延迟但效果也不会像我们所期望的那栗如果脚本可以被延迟Q那么它可以移到页面的底部。这会让你的面加蝲的快一炏V?/p>

24、剔除重复脚?/p>

在同一个页面中重复引用 JavaScript 文g会媄响页面的性能。你可能会认U情况ƈ不多见。对于美国前10大网站的调查昄其中有两家存在重复引用脚本的情况。有两种主要因素D一个脚本被重复引用的奇怪现象发生:团队规模和脚本数量。如果真的存在这U情况,重复脚本会引起不必要?HTTP h和无用的 JavaScript q算Q这降低了网站性能?/p>

?Internet Explorer 中会产生不必要的 HTTP hQ而在 Firefox 却不会。在 Internet Explorer 中,如果一个脚本被引用两次而且它又不可~存Q它׃在页面加载过E中产生两次 HTTP h。即时脚本可以缓存,当用户重载页面时也会?生额外的 HTTP h?/p>

除增加额外的 HTTP h外,多次q算脚本也会费旉。在 Internet Explorer ?Firefox 中不脚本是否可~存Q它们都存在重复q算 JavaScript 的问题?/p>

一个避免偶发生的两次引用同一脚本的方法是在模板中使用脚本理模块引用脚本。在 HTML 面中?<script /> 标签引用脚本的最常见Ҏ是Q?/p>

<script type=”text/javascript” src=”menu_1.0.17.js”></script>

?PHP 中可以通过创徏名ؓ insertScript 的方法来替代Q?/p>

<?php insertScript(”menu.js”) ?>

Z防止多次重复引用脚本Q这个方法中q应该用其它机制来处理脚本Q如查所属目录和本文件名中增加版本号以用?Expire 文g头等?/p>

25、减?DOM 讉K

使用 JavaScript 讉K DOM 元素比较慢,因此Z获得更多的应该页面,应该做到Q?/p>

~存已经讉Kq的有关元素
U下更新完节点之后再它们添加到文档树中
避免使用JavaScript来修攚w面布局
有关此方面的更多信息h看Julien Lecomte在YUI专题中的文章“高性能Ajax应该E序”?/p>

26、开发智能事件处理程?/p>

有时候我们会感觉到页面反应迟钝,q是因ؓDOM树元素中附加了过多的事g句柄q且些事件句病被频繁地触发。这是Z么说使用event delegationQ事件代理)是一U好Ҏ了。如果你在一个div中有10个按钮,你只需要在div上附加一ơ事件句柄就可以了,而不用去为每一个按 钮增加一个句柄。事件冒泡时你可以捕捉到事gq判断出是哪个事件发出的?/p>

你同样也不用Z操作DOM树而等待onload事g的发生。你需要做的就是等待树l构中你要访问的元素出现。你也不用等待所有图像都加蝲完毕?/p>

你可能会希望用DOMContentLoaded事g来代替onloadQ但是在所有浏览器都支持它之前你可使用YUI 事g应用E序中的onAvailableҎ?/p>

我们在前面的几节中分别讲了提高网站性能中内宏V服务器、JavaScript和CSS{方面的内容。除此之外,囄和Coockie也是我们|站中几乎不可缺组成部分,此外随着Ud讑֤的流行,对于Ud应用的优化也十分重要。这主要包括Q?/p>

Coockie:

减小Cookie体积
对于面内容使用无coockie域名

囄Q?/p>

优化囑փ
优化CSS Spirite
不要在HTML中羃攑֛?br /> favicon.ico要小而且可缓?/p>

Ud应用Q?/p>

保持单个内容于25K
打包lg成复合文?/p>

27、减Cookie体积

HTTP coockie可以用于权限验证和个性化w䆾{多U用途。coockie内的有关信息是通过HTTP文g头来在web服务器和览器之间进行交的。因此保持coockie可能的以减少用户的响应时间十分重要?/p>

有关更多信息可以查看Tenni Theurer和Patty Chi的文?#8220;When the Cookie Crumbles”。这们研I中主要包括Q?/p>

去除不必要的coockie
使coockie体积量以减少对用户响应的影响
注意在适应U别的域名上讄coockie以便使子域名不受影响
讄合理的过期时间。较早地Expire旉和不要过早去清除coockieQ都会改善用L响应旉?/p>

28、对于页面内容用无coockie域名

当浏览器在请求中同时h一张静态的囄和发送coockieӞ服务器对于这些coockie不会做Q何地使用。因此他们只是因为某些负面因素而创建的 |络传输。所有你应该定对于静态内容的h是无coockie的请求。创Z个子域名q用他来存放所有静态内宏V?/p>

如果你的域名是www.example.orgQ你可以在static.example.org上存在静态内宏V但是,如果你不是在 www.example.org而是在顶U域名example.org讄了coockieQ那么所有对于static.example.org的请求都包含coockie。在q种情况下,你可以再重新购买一个新的域名来存在静态内容,q且要保持这个域名是无coockie的。Yahoo!使用的是 ymig.comQYouTube使用的是ytimg.comQAmazon使用的是images-anazon.com{等?/p>

使用无coockie域名存在静态内容的另外一个好处就是一些代理(服务器)可能会拒l对coockie的内容请求进行缓存。一个相关的是Q如果你想确定应该用example.orgq是www.example.org作ؓ你的一主页Q你要考虑到coockie带来的媄响。忽略掉www会你除了把coockie讄?.example.orgQ?是泛域名解析Q代表了所有子域名Q外没有其它选择Q因此出于性能斚w的考虑最好是使用带有 www的子域名q且在它上面讄coockie?/p>

29、优化图?/p>

设计人员完成寚w面的设计之后Q不要急于它们上传到web服务器,q里q需要做几g事:

你可以检查一下你的GIF囄中图像颜色的数量是否和调色板规格一致。用imagemagick中下面的命o行很Ҏ查:

identify -verbose image.gif

如果你发现图片中只用C4U颜Ԍ而在调色板的中显C的256色的颜色槽,那么q张囄p有压~的I间?br /> 试把GIF格式转换成PNG格式Q看看是否节省空间。大多数情况下是可以压羃的。由于浏览器支持有限Q设计者们往往不太乐意使用PNG格式的图片,不过q都是过ȝ事情了。现在只有一个问题就是在真彩PNG格式中的alpha通道半透明问题Q不q同LQGIF也不是真彩格式也不支持半透明。因此GIF 能做到的QPNGQPNG8Q同样也能做刎ͼ除了动画Q。下面这条简单的命o可以安全地把GIF格式转换为PNG格式Q?/p>

convert image.gif image.png

“我们要说的是Q给PNG一个施展n手的Z吧!”

在所有的PNG囄上运行pngcrushQ或者其它PNG优化工具Q。例如:

pngcrush image.png -rem alla -reduce -brute result.png

在所有的JPEG囄上运行jpegtran。这个工具可以对囄中的出现的锯齿等做无损操作,同时它还可以用于优化和清除图片中的注释以及其它无用信息(如EXIF信息Q:

jpegtran -copy none -optimize -perfect src.jpg dest.jpg

30、优化CSS Spirite

在Spirite中水qx列你的图片,垂直排列会稍E增加文件大;

Spirite中把颜色较近的组合在一起可以降低颜色数Q理想状冉|低于256色以侉K用PNG8格式Q?/p>

便于UdQ不要在Spirite的图像中间留有较大空隙。这虽然不大会增加文件大但对于用户代理来说它需要更的内存来把囄解压为像素地图?00×100的图片ؓ1万像素,?000×1000是100万像素?/p>

31、不要在HTML中羃攑֛?/p>

不要Z在HTML中设|长宽而用比实际需要大的图片。如果你需要:

<img width=”100″ height=”100″ src=”mycat.jpg” alt=”My Cat” />

那么你的囄Qmycat.jpgQ就应该?00×100像素而不是把一?00×500像素的图片羃用?/p>

32、favicon.ico要小而且可缓?/p>

favicon.ico是位于服务器根目录下的一个图片文件。它是必定存在的Q因为即使你不关心它是否有用Q浏览器也会对它发出hQ因此最好不要返回一?04 Not Found的响应。由于是在同一台服务器上,它每被请求一ơcoockie׃被发送一ơ。这个图片文件还会媄响下载顺序,例如在IE中当你在 onload中请求额外的文gӞfavicon会在q些额外内容被加载前下蝲?/p>

因此Qؓ了减favicon.ico带来的弊端,要做刎ͼ

文g量地小Q最好小?K
在适当的时候(也就是你不要打算再换favicon.ico的时候,因ؓ更换新文件时不能对它q行重命名)为它讄Expires文g头。你可以很安全地把Expires文g头设|ؓ未来的几个月。你可以通过核对当前favicon.ico的上ơ编辑时间来作出判断?br /> Imagemagick可以帮你创徏y的favicon?/p>

33、保持单个内容小?5K

q条限制主要是因为iPhone不能~存大于25K的文件。注意这里指的是解压~后的大。由于单Ugizp压羃可能达不要求Q因此精文g显得十分重要?/p>

34、打包组件成复合文本

把页面内Ҏ包成复合文本如同带有多附g的EmailQ它能够使你在一个HTTPh中取得多个组Ӟ切记QHTTPh是很奢侈的)。当你用这条规则时Q首先要定用户代理是否支持QiPhone׃支持Q?/p>

Best Practices for Speeding Up Your Web SiteQ?/p>

Make Fewer HTTP Requests
Use a Content Delivery Network
Add an Expires or a Cache-Control Header
Gzip Components
Put Stylesheets at the Top
Put Scripts at the Bottom
Avoid CSS Expressions
Make JavaScript and CSS External
Reduce DNS Lookups
Minify JavaScript and CSS
Avoid Redirects
Remove Duplicate Scripts
Configure ETags
Make Ajax Cacheable
Flush the Buffer Early
Use GET for AJAX Requests
Post-load Components
Preload Components
Reduce the Number of DOM Elements
Split Components Across Domains
Minimize the Number of iframes
No 404s
Reduce Cookie Size
Use Cookie-free Domains for Components
Minimize DOM Access
Develop Smart Event Handlers
Choose <link> over @import
Avoid Filters
Optimize Images
Optimize CSS Sprites
Don’t Scale Images in HTML
Make favicon.ico Small and Cacheable
Keep Components under 25K
Pack Components into a Multipart Document



]]>
վ֩ģ壺 Ƶ | ˳ӰԺ| Ʒѿþþ| ޹Ӱ߹ۿ| Ҹ߳Ƶ| Ļѹۿ| ˳ձ߹ۿ| av߹ۿһ | ޾Ʒþþþ| լ666ѹۿ| ɫƬѿ| Ʒ޳AA߹ۿ| ֻƵѹۿ| ޳ӰԺ߹ۿ| ٸ͵˾ƷƵ| ׾ƷͼƬ| Ļۺ234| س˵Ӱ| aɫëƬѲƵ| ˬ AVˬ| Ļһ| ƷþƵ| 뾫ƷһƵ| þþþ뾫Ʒպ| ѻɫƬ| 99þþþƷѹۿ| Ļ߿˶Ƭ| Ƶ| ֻëƬѲ| Ʒ99þѹۿ| ؼëƬAëƬ100Ѳ| ޹VA߹ۿ| ƵѴȫϼ| ǵӰȫ| ɫһƵ| ձߵӰ| ҹһӰԺ| þAV˳׽| 91߹ۿ| þݹѹۿ| ˺Ů˸߳վ|