Yahoo对Web前端优化的14条经验拔萃
当浏览器通过代理来发送请求时,有可能出现浏览器期望接受的压缩后内容和实际接收到的不一致的情况。解决这一问题的方法是在Web服务器的响应中添加Vary头。Web服务器可以告诉代理根据一个或多个请求头来改变缓存的响应。由于压缩的决定是基于Accept-Encoding请求头的,因此需要在服务器的Vary响应头中包含Accept-Encoding: 复制代码 代码如下:
目前大约90%的通过浏览器进行的Internet通信都需要使用gzip,使得服务端和客户端的对等性变得额外重要。无论是客户端还是服务端发送错误,都会造成页面被破坏。避免错误的一种方式是采用“浏览器白名单”方式,即只为经过证实支持压缩的浏览器提供压缩内容,但是当代理缓存加进来以后,处理边缘情形浏览器将变得更加复杂。另一种方式是使用Vary: *或Cache-Control: private头来禁用代理缓存。此种方式会为所有浏览器禁用代理缓存,从而增加带宽开销。如何平衡压缩和代理支持需要在加快响应时间、减小带宽开销和边缘情形浏览器缺陷之间进行权衡: 如果网站的用户很少,并且他们处于一个小圈子中,边缘情形浏览器不需要太多关注,可以压缩内容并使用Vary: Accept-Encoding。 如果更注重带宽开销,可以和前一种情形一样,压缩内容并使用Vary: Accept-Encoding。 如果网站拥有大量的、多变的用户群,能够应付较高的带宽开销,并且享有高质量的名声,需要压缩内容并使用Cache-Control: Private。(Google和Yahoo都使用这种方式) 规则5——将样式表放在顶部(Put Stylesheets at the Top) 样式表在页面中的位置并不影响下载时间,但是会影响页面的呈现。根据HTML规范“和A不一样,[LINK]只能出现在文档的HEAD节中,但其出现次数是任意的”。因此,问题的解决方式应该是遵循HTML规范,使用LINK标签将样式表放在文档的HEAD中。 规则6——将脚本放在底部(Put Scripts at the Bottom) 需要我们注意的是,下载脚本时并行下载实际上是被禁用的,即使此时使用了不同的主机名,浏览器也不会启动其他下载。因此,如果将脚本放在顶部,脚本会阻塞后面内容的呈现,也会阻塞后面组件的下载。因此,放置脚本最好的地方是页面底部,这不会阻止页面内容呈现,而且页面中的可视组件可以尽早下载。 规则7——避免CSS表达式(Avoid CSS Expressions) 减少CSS表达式求值次数的一种方式是使用一次性表达式,如果CSS表达式必须被求值一次,可以在这一次中执行重写它本身。除此之外,还可以使用事件处理器来为特定的事件提供所期望的动态行为。 规则8——使用外部JavaScript和CSS(Make JavaScript and CSS External) 决定是否使用外部文件的关键在于被缓存的外部文件占请求的HTML文档数的比重。如果网站用户在每次会话中进行多次页面访问,同时页面重用了多个脚本和样式表,使用外部文件时很好的选择。 对于大多数网站而言,难以精确度量以判断是否使用内联或外部文件,此时建议是使用外部文件的方式。对于这个问题的一个例外是网站主页,由于主页对于响应时间要求更高,因此更加倾向于内联而不是外部文件。 对于内联文件而言,由于无法利用浏览器缓存,因此给人感觉依然比较低效。我们可以通过加载后下载和动态内联的方式来使得网站主页既可以获得内联的优势,同时也能缓存外部文件。
DNS查找可以被缓存起来以提高性能,这种缓存可以发生在ISP或局域网中的一台特殊的缓存服务器上,同时,缓存也会发生在独立的用户机器上。在用户请求一个主机名后,DNS信息会留在操作系统的DNS缓存中,大多数浏览器也拥有自己的缓存,和操作系统缓存相分离。只要浏览器在其缓存中保留了DNS记录,就不会通过操作系统来请求这个记录。 当客户端浏览器和操作系统中DNS缓存同时为空时,DNS查询的数量等于页面中唯一主机名的数量,这些主机名包括了页面的URL、图片、脚本、样式表、Flash等。所以,减少唯一主机名数量,可以减少DNS查询数。 减少唯一主机名数量会潜在的减少页面中并行下载的数量。避免DNS查找降低了响应时间,但减少并行下载可能会增加响应时间。对于这种情形,建议将这些组件放在至少2个,但不要超过4个主机名下。 (编辑:焦作站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |