Yahoo!网站性能最佳体验的34条黄金守则 JavaScript和CSS

上传人:z****2 文档编号:179610457 上传时间:2023-01-02 格式:DOCX 页数:10 大小:27.73KB
返回 下载 相关 举报
Yahoo!网站性能最佳体验的34条黄金守则 JavaScript和CSS_第1页
第1页 / 共10页
Yahoo!网站性能最佳体验的34条黄金守则 JavaScript和CSS_第2页
第2页 / 共10页
Yahoo!网站性能最佳体验的34条黄金守则 JavaScript和CSS_第3页
第3页 / 共10页
点击查看更多>>
资源描述
转载自 http:/www.dudo.org/article.asp?id = 216英文地址:在第一部分和第二部分中我们分别介绍了改善网站性能中页面内容和服务器的几条守则,除此之外,JavaScript和CSS也是我们页面中经常用到的内容,对它们的优化也提高网站性能的重要方面:CSS:1.把样式表置于顶部2.避免使用CSS表达式(Expression)3.使用外部JavaScript和CSS4.削减 JavaScript 和 CSS5.用 代替 imp ort6.避免使用滤镜JavaScript1.把脚本置于页面底部2.使用外部JavaScript和CSS3.削减 JavaScript 和 CSS4.剔除重复脚本5.减少DOM访问6.开发智能事件处理程序17、把样式表置于顶部在研究Yahoo!的性能表现时,我们发现把样式表放到文档的head /内部似乎会加快页面的下载 速度。这是因为把样式表放到head /内会使页面有步骤的加载显示。注重性能的前端服务器往往希望页面有秩序地加载。同时,我们也希望浏览器把已经接收到内容尽可 能显示出来。这对于拥有较多内容的页面和网速较慢的用户来说特别重要。向用户返回可视化的反馈,比 如进程指针,已经有了较好的研究并形成了正式文档。在我们的研究中HTML页面就是进程指针。当浏览 器有序地加载文件头、导航栏、顶部的logo等对于等待页面加载的用户来说都可以作为可视化的反馈。这 从整体上改善了用户体验。把样式表放在文档底部的问题是在包括Inte rnet Explo rer在内的很多浏览器中这会中止内容的有序 呈现。浏览器中止呈现是为了避免样式改变引起的页面元素重绘。用户不得不面对一个空白页面。HTML规范清楚指出样式表要放包含在页面的head /区域内: 和a/不同,link /只能出现在文 档的head /区域内,尽管它可以多次使用它”。无论是引起白屏还是出现没有样式化的内容都不值得去 尝试。最好的方案就是按照HTML规范在文档head /内加载你的样式表。18、避免使用CSS表达式(Expression)CSS表达式是动态设置CSS属性的强大(但危险)方法。Internet Explorer从第5个版本开始支 持CSS表达式。下面的例子中,使用CSS表达式可以实现隔一个小时切换一次背景颜色:background-color: expression( (new Date().getHours()%2 ? #B8D4FF :#F08A00); 如上所示,expression中使用了 JavaScript表达式。CSS属性根据JavaScript表达式的计算结果来设 置。expression方法在其它浏览器中不起作用,因此在跨浏览器的设计中单独针对Internet Explorer 设置时会比较有用。表达式的问题就在于它的计算频率要比我们想象的多。不仅仅是在页面显示和缩放时,就是在页面滚 动、乃至移动鼠标时都会要重新计算一次。给CSS表达式增加一个计数器可以跟踪表达式的计算频率。在 页面中随便移动鼠标都可以轻松达到10000次以上的计算量。一个减少CSS表达式计算次数的方法就是使用一次性的表达式,它在第一次运行时将结果赋给指定 的样式属性,并用这个属性来代替CSS表达式。如果样式属性必须在页面周期内动态地改变,使用事件句 柄来代替CSS表达式是一个可行办法。如果必须使用CSS表达式,一定要记住它们要计算成千上万次并 且可能会对你页面的性能产生影响。19、使用外部 JavaScript 和 CSS很多性能规则都是关于如何处理外部文件的。但是,在你采取这些措施前你可能会问到一个更基本的 问题:JavaScript和CSS是应该放在外部文件中呢还是把它们放在页面本身之内呢?在实际应用中使用外部文件可以提高页面速度,因为JavaScript和CSS文件都能在浏览器中产生缓 存。内置在HTML文档中的JavaScript和CSS则会在每次请求中随HTML文档重新下载。这虽然减少 了 HTTP请求的次数,却增加了 HTML文档的大小。从另一方面来说,如果外部文件中的JavaScript和 CSS被浏览器缓存,在没有增加HTTP请求次数的同时可以减少HTML文档的大小。关键问题是,外部JavaScript和CSS文件缓存的频率和请求HTML文档的次数有关。虽然有一定 的难度,但是仍然有一些指标可以一测量它。如果一个会话中用户会浏览你网站中的多个页面,并且这些 页面中会重复使用相同的脚本和样式表,缓存外部文件就会带来更大的益处。许多网站没有功能建立这些指标。对于这些网站来说,最好的坚决方法就是把JavaScript和CSS作 为外部文件引用。比较适合使用内置代码的例外就是网站的主页,如Yahoo!主页和My Yahoo!。主页在 一次会话中拥有较少(可能只有一次)的浏览量,你可以发现内置JavaScript和CSS对于终端用户来说 会加快响应时间。对于拥有较大浏览量的首页来说,有一种技术可以平衡内置代码带来的HTTP请求减少与通过使用外 部文件进行缓存带来的好处。其中一个就是在首页中内置JavaScript和CSS,但是在页面下载完成后动 态下载外部文件,在子页面中使用到这些文件时,它们已经缓存到浏览器了。20、削减 JavaScript 和 CSS精简是指从去除代码不必要的字符减少文件大小从而节省下载时间。消减代码时,所有的注释、不需 要的空白字符(空格、换行、tab缩进)等都要去掉。在JavaScript中,由于需要下载的文件体积变小 了从而节省了响应时间。精简JavaScript中目前用到的最广泛的两个工具是JSMin和YUI Compressor YUI Compressor还可用于精简CSS。混淆是另外一种可用于源代码优化的方法。这种方法要比精简复杂一些并且在混淆的过程更易产生问 题。在对美国前10大网站的调查中发现,精简也可以缩小原来代码体积的21%,而混淆可以达到25%。 尽管混淆法可以更好地缩减代码,但是对于JavaScript来说精简的风险更小。除消减外部的脚本和样式表文件外,script和style代码块也可以并且应该进行消减。即使你 用Gzip压缩过脚本和样式表,精简这些文件仍然可以节省5%以上的空间。由于JavaScript和CSS的 功能和体积的增加,消减代码将会获得益处。21、用vlink代替import前面的最佳实现中提到CSS应该放置在顶端以利于有序加载呈现。在IE中,页面底部import和使用link作用是一样的,因此最好不要使用它。22、避免使用滤镜IE独有属性AlphalmageLoader用于修正7.0以下版本中显示PNG图片的半透明效果。这个滤镜 的问题在于浏览器加载图片时它会终止内容的呈现并且冻结浏览器。在每一个元素(不仅仅是图片)它都 会运算一次,增加了内存开支,因此它的问题是多方面的。完全避免使用AlphaImageLoader的最好方法就是使用PNG8格式来代替,这种格式能在IE中很 好地工作。如果你确实需要使用AlphaImageLoader,请使用下划线_filter又使之对IE7以上版本的用 户无效。23、把脚本置于页面底部脚本带来的问题就是它阻止了页面的平行下载。HTTP/1.1规范建议,浏览器每个主机名的并行下载 内容不超过两个。如果你的图片放在多个主机名上,你可以在每个并行下载中同时下载2个以上的文件。 但是当下载脚本时,浏览器就不会同时下载其它文件了,即便是主机名不相同。在某些情况下把脚本移到页面底部可能不太容易。比如说,如果脚本中使用了 document.write来插 入页面内容,它就不能被往下移动了。这里可能还会有作用域的问题。很多情况下,都会遇到这方面的问 题。一个经常用到的替代方法就是使用延迟脚本。DEFER属性表明脚本中没有包含document.write, 它告诉浏览器继续显示。不幸的是,Fir efox并不支持DEFER属性。在Inte rnet Explo rer中,脚本可能 会被延迟但效果也不会像我们所期望的那样。如果脚本可以被延迟,那么它就可以移到页面的底部。这会 让你的页面加载的快一点。24、剔除重复脚本在同一个页面中重复引用JavaScript文件会影响页面的性能。你可能会认为这种情况并不多见。对 于美国前10大网站的调查显示其中有两家存在重复引用脚本的情况。有两种主要因素导致一个脚本被重 复引用的奇怪现象发生:团队规模和脚本数量。如果真的存在这种情况,重复脚本会引起不必要的HTTP 请求和无用的JavaSc ript运算,这降低了网站性能。在Inte rnet Expl orer中会产生不必要的HTTP请求,而在Fir efox却不会。在Inte rnet Expl orer 中,如果一个脚本被引用两次而且它又不可缓存,它就会在页面加载过程中产生两次HTTP请求。即时脚 本可以缓存,当用户重载页面时也会产生额外的HTTP请求。除增加额外的HTTP请求外,多次运算脚本也会浪费时间。在Inte rnet Explo rer和Fir efox中不管 脚本是否可缓存,它们都存在重复运算JavaScript的问题。一个避免偶尔发生的两次引用同一脚本的方法是在模板中使用脚本管理模块引用脚本。在HTML页面 中使用标签引用脚本的最常见方法就是:在PHP中可以通过创建名为insertScript的方法来替代:为了防止多次重复引用脚本,这个方法中还应该使用其它机制来处理脚本,如检查所属目录和为脚本文件 名中增加版本号以用于Expire文件头等。25、减少DOM访问使用JavaScript访问DOM元素比较慢,因此为了获得更多的应该页面,应该做到: 缓存已经访问过的有关元素 线下更新完节点之后再将它们添加到文档树中 避免使用JavaScript来修改页面布局有关此方面的更多信息请查看Julien Lecomte在YUI专题中的文章高性能Ajax应该程序”。26、开发智能事件处理程序有时候我们会感觉到页面反应迟钝,这是因为DOM树元素中附加了过多的事件句柄并且些事件句病 被频繁地触发。这就是为什么说使用event delegation (事件代理)是一种好方法了。如果你在一个div 中有10个按钮,你只需要在div上附加一次事件句柄就可以了,而不用去为每一个按钮增加一个句柄。 事件冒泡时你可以捕捉到事件并判断出是哪个事件发出的。你同样也不用为了操作DOM树而等待onload事件的发生。你需要做的就是等待树结构中你要访问 的元素出现。你也不用等待所有图像都加载完毕。你可能会希望用DOMContentLoaded事件来代替onload,但是在所有浏览器都支持它之前你可使 用YUI事件应用程序中的onAvailable方法。有关此方面的更多信息请查看Julien Lecomte在YUI专题中的文章高性能Ajax应该程序”。分类:未分类标签:Yahoo网站性能最佳体验的4条黄金守则:服务器2008年7月28日 没有评论转载自 http:/www.dudo.org/article.asp?id = 215英文地址:在本系列的第一节中,讲了提高网站性能中网站内容”有关的10条原则。除了在网站在内容上的改进外, 在网站服务器端上也有需要注意和改进的地方,它们包括:1.使用内容分发网络2. 为文件头指定 Expires 或 Cache-Control3. Gzip压缩文件内容4. 配置ETag5. 尽早刷新输出缓冲6. 使用GET来完成AJAX请求11、使用内容分发网络用户与你网站服务器的接近程度会影响响应时间的长短。把你的网站内容分散到多个、处于不同地域 位置的服务器上可以加快下载速度。但是首先我们应该做些什么呢?按地域布置网站内容的第一步并不是要尝试重新架构你的网站让他们在分发服务器上正常运行。根据 应用的需求来改变网站结构,这可能会包括一些比较复杂的任务,如在服务器间同步Session状态和合 并数据库更新等。要想缩短用户和内容服务器的距离,这些架构步骤可能是不可避免的。要记住,在终端用户的响应时间中有80%到90%的响应时间用于下载图像、样式表、脚本、Flash 等页面内容。这就是网站性能黄金守则。和重新设计你的应用程序架构这样比较困难的任务相比,首先来 分布静态内容会更好一点。这不仅会缩短响应时间,而且对于内容分发网络来说它更容易实现。内容分发网络(Content Delivery Network,CDN)是由一系列分散到各个不同地理位置上的 Web服务器组成的,它提高了网站内容的传输速度。用于向用户传输内容的服务器主要是根据和用户在 网络上的靠近程度来指定的。例如,拥有最少网络跳数( network hops)和响应速度最快的服务器会 被选定。一些大型的网络公司拥有自己的CDN,但是使用像Akamai Technologies,Mirror Image Internet,或者Limelight Networks这样的CDN服务成本却非常高。对于刚刚起步的企业和个 人网站来说,可能没有使用CDN的成本预算,但是随着目标用户群的不断扩大和更加全球化,CDN就 是实现快速响应所必需的了。以Yahoo来说,他们转移到CDN上的网站程序静态内容节省了终端用户 20%以上的响应时间。使用CDN是一个只需要相对简单地修改代码实现显著改善网站访问速度的方法。12、为文件头指定 Expires 或 Cache-Control这条守则包括两方面的内容:对于静态内容:设置文件头过期时间Expires的值为“Never expire”(永不过期) 对于动态内容:使用恰当的Cache-Control文件头来帮助浏览器进行有条件的请求网页内容设计现在越来越丰富,这就意味着页面中要包含更多的脚本、样式表、图片和Flash。第一 次访问你页面的用户就意味着进行多次的HTTP请求,但是通过使用Expires文件头就可以使这样内容具 有缓存性。它避免了接下来的页面访问中不必要的HTTP请求。Expires文件头经常用于图像文件,但是 应该在所有的内容都使用他,包括脚本、样式表和Flash等。浏览器(和代理)使用缓存来减少HTTP请求的大小和次数以加快页面访问速度Web服务器在HTTP 响应中使用Expires文件头来告诉客户端内容需要缓存多长时间。下面这个例子是一个较长时间的 Expires文件头,它告诉浏览器这个响应直到2010年4月15日才过期。Expires: Thu, 15 Apr 2010 20:00:00 GMT如果你使用的是Apache服务器,可以使用ExpiresDefault来设定相对当前日期的过期时间。下面 这个例子是使用ExpiresDefault来设定请求时间后10年过期的文件头:Exp ir esDefault access plus 10 yea rs要切记,如果使用了 Expires文件头,当页面内容改变时就必须改变内容的文件名。依Yahoo!来说 我们经常使用这样的步骤:在内容的文件名中加上版本号,如yahoo_2.0.6js。使用Expires文件头只有会在用户已经访问过你的网站后才会起作用。当用户首次访问你的网站时这 对减少HTTP请求次数来说是无效的,因为浏览器的缓存是空的。因此这种方法对于你网站性能的改进情 况要依据他们预缓存存在时对你页面的点击频率(“预缓存”中已经包含了页面中的所有内容)。Yahoo! 建立了一套测量方法,我们发现所有的页面浏览量中有7585%都有预缓存。通过使用Exp ires文件 头,增加了缓存在浏览器中内容的数量,并且可以在用户接下来的请求中再次使用这些内容,这甚至都不 需要通过用户发送一个字节的请求。13、Gzip压缩文件内容网络传输中的HTTP请求和应答时间可以通过前端机制得到显著改善。的确,终端用户的带宽、互联 网提供者、与对等交换点的靠近程度等都不是网站开发者所能决定的。但是还有其他因素影响着响应时间。 通过减小HTTP响应的大小可以节省HTTP响应时间。从HTTP/1.1开始,web客户端都默认支持HTTP请求中有Accept-Encoding文件头的压缩格式:Accept-Encoding: gzip, deflate如果web服务器在请求的文件头中检测到上面的代码,就会以客户端列出的方式压缩响应内容oWeb 服务器把压缩方式通过响应文件头中的Content-Encoding来返回给浏览器。Content-Encoding: gzipGzip是目前最流行也是最有效的压缩方式。这是由GNU项目开发并通过RFC 1952来标准化的。 另外仅有的一个压缩格式是deflate,但是它的使用范围有限效果也稍稍逊色。Gzip大概可以减少70%的响应规模。目前大约有90%通过浏览器传输的互联网交换支持gzip格式。 如果你使用的是Apache,gzip模块配置和你的版本有关:Apache 1.3使用mod_zip,而Apache 2.x 使用 moflate浏览器和代理都会存在这样的问题:浏览器期望收到的和实际接收到的内容会存在不匹配的现象。幸 好,这种特殊情况随着旧式浏览器使用量的减少在减少。Apache模块会通过自动添加适当的Vary响应 文件头来避免这种状况的出现。服务器根据文件类型来选择需要进行gzip压缩的文件,但是这过于限制了可压缩的文件。大多数web 服务器会压缩HTML文档。对脚本和样式表进行压缩同样也是值得做的事情,但是很多web服务器都没 有这个功能。实际上,压缩任何一个文本类型的响应,包括XML和J SON,都值得的。图像和PDF文件 由于已经压缩过了所以不能再进行gzip压缩。如果试图gizp压缩这些文件的话不但会浪费CPU资源还会 增加文件的大小。Gzip压缩所有可能的文件类型是减少文件体积增加用户体验的简单方法。14、配置 ETagEntity tags(ETags)(实体标签)是web服务器和浏览器用于判断浏览器缓存中的内容和服务器 中的原始内容是否匹配的一种机制(“实体”就是所说的内容,包括图片、脚本、样式表等)。增加ETag 为实体的验证提供了一个比使用“last-modified date (上次编辑时间)”更加灵活的机制。Etag是一个识 别内容版本号的唯一字符串。唯一的格式限制就是它必须包含在双引号内。原始服务器通过含有ETag文 件头的响应指定页面内容的ETag。HTTP/1.1 200 OKLast-Modified: Tue, 12 Dec 2006 03:03:59 GMTETag: 10c24bc-4ab-457e1c1fContent-Length: 12195稍后,如果浏览器要验证一个文件,它会使用If-None-Match文件头来把ETag传回给原始服务器。 在这个例子中,如果ETag匹配,就会返回一个304状态码,这就节省了 12195字节的响应。 GET /i/yahoo.gif HTTP/1.1Host: If-Modified-Since: Tue, 12 Dec 2006 03:03:59 GMTIf-None-Match: 10c24bc-4ab-457e1c1fHTTP/1.1 304 Not ModifiedETag的问题在于,它是根据可以辨别网站所在的服务器的具有唯一性的属性来生成的。当浏览器从 一台服务器上获得页面内容后到另外一台服务器上进行验证时ETag就会不匹配,这种情况对于使用服务 器组和处理请求的网站来说是非常常见的。默认情况下,Apache和IIS都会把数据嵌入ETag中,这会 显著减少多服务器间的文件验证冲突。Apache 1.3和2.x中的ETag格式为inode-size-timestamp。即使某个文件在不同的服务器上会 处于相同的目录下,文件大小、权限、时间戳等都完全相同,但是在不同服务器上他们的内码也是不同的。IIS 5.0和 IIS 6.0处理ETag 的机制相似IIS 中的 ETag格式为 Filetimestamp:ChangeNumber。 用ChangeNumber来跟踪IIS配置的改变。网站所用的不同IIS服务器间ChangeNumber也不相同。 不同的服务器上的Apache和IIS即使对于完全相同的内容产生的ETag在也不相同,用户并不会接收到 一个小而快的304响应;相反他们会接收一个正常的200响应并下载全部内容。如果你的网站只放在一 台服务器上,就不会存在这个问题。但是如果你的网站是架设在多个服务器上,并且使用Apache和IIS 产生默认的ETag配置,你的用户获得页面就会相对慢一点,服务器会传输更多的内容,占用更多的带宽, 代理也不会有效地缓存你的网站内容。即使你的内容拥有Expires文件头,无论用户什么时候点击刷新” 或者重载”按钮都会发送相应的GET请求。如果你没有使用ETag提供的灵活的验证模式,那么干脆把所有的ETag都去掉会更好。 Last-Modified文件头验证是基于内容的时间戳的。去掉ETag文件头会减少响应和下次请求中文件的大 小。微软的这篇支持文稿讲述了如何去掉ETag。在Apache中,只需要在配置文件中简单添加下面一行 代码就可以了:FileETag none15、尽早刷新输出缓冲当用户请求一个页面时,无论如何都会花费200到500毫秒用于后台组织HTML文件。在这期间, 浏览器会一直空闲等待数据返回。在PHP中,你可以使用flush()方法,它允许你把已经编译的好的部分 HTML响应文件先发送给浏览器,这时浏览器就会可以下载文件中的内容(脚本等)而后台同时处理剩余 的HTML页面。这样做的效果会在后台烦恼或者前台较空闲时更加明显。输出缓冲应用最好的一个地方就是紧跟在之后,因为HTML的头部分容易生成而且头部往 往包含CSS和JavaScript文件,这样浏览器就可以在后台编译剩余HTML的同时并行下载它们。例子:为了证明使用这项技术的好处,Yahoo!搜索率先研究并完成了用户测试。16、使用GET来完成AJAX请求Yahoo!Mail团队发现,当使用XMLHttpRequest时,浏览器中的POST方法是一个两步走”的过程:首 先发送文件头,然后才发送数据。因此使用GET最为恰当,因为它只需发送一个TCP包(除非你有很多 cookie)。IE中URL的最大长度为2K,因此如果你要发送一个超过2K的数据时就不能使用GET 了。一个有趣的不同就是POST并不像GET那样实际发送数据。根据HTTP规范,GET意味着获取数 据,因此当你仅仅获取数据时使用GET更加有意义(从语意上讲也是如此),相反,发送并在服务端保存 数据时使用POST。
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑环境 > 建筑资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!