加入收藏 | 设为首页 | 会员中心 | 我要投稿 焦作站长网 (https://www.0391zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 运营中心 > 建站资源 > 优化 > 正文

Yahoo对Web前端优化的14条经验拔萃

发布时间:2020-03-19 00:24:33 所属栏目:优化 来源:互联网
导读:Yahoo在前端优化过程中逐渐形成了一些约定俗成的规则,这些经验非常宝贵并不断被人们翻译和分享,35条版本流传甚广,我们这里精简出Yahoo的Web前端优化的14条经验拔

规则10——精简JavaScript和CSS(Minify JavaScript and CSS)
精简是从代码中移除不必要的字符以减小其大小,进而改善加载时间。在代码被精简后,所有注释以及不必要的空白字符(空格、换行和制表符)都将被移除。对于JavaScript而言,因为需要下载的文件大小减小了,可以改善响应时间。

混淆是可以应用在源代码上的另一种优化方式。相比较于精简,混淆更加复杂,因此更容易产生bug。混淆可以更大程度上压缩源代码,但是也存在着一定的风险。

除了外部JavaScript外,内联在<script>和<style>块中的源代码也需要被精简。即使使用了gzip来压缩JavaScript和CSS,使用精简能够将代码大小再减少5%或者更多。

规则11——避免重定向(Avoid Redirects)
重定向用于将用户从一个URL路由到另一个URL。重定向有很多种,其中301和302是最常用的两种。下面是一个301响应头的示例:

复制代码

代码如下:


HTTP/1.1 301 Moved Permanently
Location:
Content-Type: text/html


浏览器会自动将用户带到Location字段给出的URL。重定向所必需的所有信息都包含在这个头中,响应体通常是空的。不管叫什么名字,301或者302响应在实际中都不会被缓存,除非有附加的头(如Expires或Cache-Control等)要求它这么做。meta refresh标签和JavaScript也可以用于重定向,但是最好的技术是使用标准的3xx状态码,以保证后退按钮能够正常工作。

需要我们记住的是重定向会使页面变慢。在用户和HTML文档间插入一个重定向后,在此HTML文档到达之前页面上不会描绘任何东西,任何组件也不会被下载。

有一种重定向最为浪费,发生的也很频繁,但是Web开发人员通常都没有意识到它,它发生在URL的结尾必须出现斜线(/)而没有出现的情形。例如访问地址将导致一个301响应包含重定向至。当主机名后缺少结尾斜线时不会发生重定向。在Apache中,我们可以通过Alias指令或者mod_rewrite模块或者DirectorySlash指令来处理缺少结尾斜线时的重定向问题。

从一个旧的站点链接到新的站点是使用重定向的另一种常见场景。其他形式还包括将一个网站的不同部分连接起来,以及基于一些条件(浏览器类型、用户帐户类型等)来引导用户。使用重定向来连接两个网站很简单而且只需要很少的额外代码。但是,虽然重定向降低了开发的复杂性,也损害了用户体验,通常可以进行其他的选择:如果两个代码的路径在同一台服务器上,可以使用Alias和mod_rewrite;如果域名由于重定向发生改变,可以使用一个CNAME(一条DNS记录,用于创建一个域名指向另一个域名的别名)让两个主机名指向相同的服务器,然后使用Alias和mod_rewrite。

规则12——移除重复脚本(Remove Duplicate Scripts)
在一个页面中两次保护同一个JavaScript文件会损伤性能。导致一个脚本重复的因素主要有两个——团队大小和脚本数量。

当重复脚本的现象发生时,将产生不必要的HTTP请求和浪费执行JavaScript的时间。不必要的HTTP请求会发生在IE中,而不会发生在Firefox中。在IE中,如果脚本被包含两次且没有被缓存,浏览器会在页面加载期间产生两个HTTP请求;即使脚本可以缓存,当用户重新加载页面时也会产生额外的HTTP请求。对JavaScript进行的多余的执行从而浪费时间的现象在IE和Firefox中都存在,与脚本是否被缓存无关。

避免意外包含同一脚本两次的一种方法是在你的模块系统中实现一个脚本管理模块。包含脚本的典型方式是在HTML页面中使用SCRIPT标签:

JavaScript Code复制内容到剪贴板

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

另一种选择是在PHP中创建一个函数:

PHP Code复制内容到剪贴板

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

为了防止统一个脚本被重复添加多次,insertScript函数需要添加处理脚本的依赖性和版本的功能。

规则13——配置Etag(Configure ETags)
实体标签(Entity Tag,ETag)是Web服务器和浏览器用于确认缓存组件的有效性的一种机制。ETag在HTTP1.1中引入,用于检测浏览器缓存中的组件与原始服务器上的组件是否匹配。ETag是唯一标识了一个组件的一个特定版本字符串。唯一的约束是该字符串必须用引号引起来。原始服务器使用Etag响应头来指定组件的ETag。

复制代码

代码如下:


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


此后,如果浏览器必须验证一个组件,它会使用If-None-Match头将ETag传回原始服务器。如果ETag是匹配的,就会返回304状态码,在此例中使响应减少12195字节。

复制代码

代码如下:


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


ETag的问题在于,通常使用组件的某些属性来构造它,这些属性对于特定的、寄宿了网站的服务器来说是唯一的。当浏览器从一台服务器上获取了原始组件之后又尝试向另一台服务器来验证组件时,ETag是不匹配的。这种情况对于使用服务器集群来处理请求的网站来说是很常见的一种情况。默认情况下,Apache和IIS向ETag中嵌入的数据都会大大降低有效性验证的成功率。

Apache1.3和2.x的ETag格式是inode-size-timestamp。文件系统使用inode来存储诸如文件类型、所有者、组和访问模式等信息。尽管在多台服务器上一个给定的文件可能位于相同的目录、具有相同的文件大小、权限、时间戳等,从一台服务器到另一台服务器,器inode仍然是不同的。
IIS5.0和6.0在ETag上有着类似的问题。IIS上ETag的格式是Filetimestamp:ChangeNumber。ChangeNumber适用于跟踪IIS配置变化的计数器。对于一个网站背后的所有IIS服务器来说,ChangeNumber不大可能相同。

(编辑:焦作站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读