提高网站速度的最佳实践

news/2024/5/9 18:09:11/文章来源:https://blog.csdn.net/lllzd/article/details/7967241
相信互联网已经越来越成为人们生活中不可或缺的一部分。ajax,flex等等富客户端的应用使得人们越加“幸福”地体验着许多原先只能在C/S实现的功能。比如Google机会已经把最基本的office应用都搬到了互联网上。当然便利的同时毫无疑问的也使页面的速度越来越慢。自己是做前端开发的,在性能方面,根据yahoo的调查,后台只占5%,而前端高达95%之多,其中有88%的东西是可以优化的。
liftpage.jpg 
以上是一张web2.0页面的生命周期图。工程师很形象地讲它分成了“怀孕,出生,毕业,结婚”四个阶段。如果在我们点击网页链接的时候能够意识到这个过程而不是简单的请求-响应的话,我们便可以挖掘出很多细节上可以提升性能的东西。今天听了淘宝小马哥的一个对yahoo开发团队对web性能研究的一个讲座,感觉收获很大,想在blog上做个分享。

相信很多人都听过优化网站性能的14条规则。更多的信息可见 developer.yahoo.com

1. 尽可能的减少 HTTP 的请求数 [content]
2. 使用 CDN(Content Delivery Network) [server]
3. 添加 Expires 头(或者 Cache-control ) [server]
4. Gzip 组件 [server]
5. 将 CSS 样式放在页面的上方 [css]
6. 将脚本移动到底部(包括内联的) [javascript]
7. 避免使用 CSS 中的 Expressions [css]
8. 将 JavaScript 和 CSS 独立成外部文件 [javascript] [css]
9. 减少 DNS 查询 [content]
10. 压缩 JavaScript 和 CSS (包括内联的) [javascript] [css]
11. 避免重定向 [server]
12. 移除重复的脚本 [javascript]
13. 配置实体标签(ETags) [css]
14. 使 AJAX 缓存
在firefox下有一个插件yslow,集成在firebug中,你可以用它很方便地来看看自己的网站在这几个方面的表现。

firebug-yslow.jpg 

这是对用yslow对我的网站 西风坊 测评的结果,很遗憾,只有51分。呵呵。中国各大网站的分值都不高,刚测了一下,新浪和网易都是31分。然后 yahoo (美国)的分值确实97分!可见yahoo在这方面作出的努力。从他们总结的这14条规则,已经现在又新增加的20个点来看,有很多细节我们真得是怎么都不会去想,有些做法甚至是有些“变态”了。
第一条、尽可能的减少 HTTP 的请求数  ( Make Fewer HTTP Requests  )
http请求是要开销的,想办法减少请求数自然可以提高网页速度。常用的方法,合并css,js(将一个页面中的css和js文件分别合并)以及Image maps和csssprites等。当然或许将css,js文件拆分多个是因为css结构,共用等方面的考虑。阿里巴巴中文站当时的做法是开发时依然分开开发,然后在后台对js,css进行合并,这样对于浏览器来说依然是一个请求,但是开发时仍然能还原成多个,方便管理和重复引用。yahoo甚至建议将首页的css和js直接写在页面文件里面,而不是外部引用。因为首页的访问量太大了,这么做也可以减少两个请求数。而事实上国内的很多门户都是这么做的。
而css sprites是指只用将页面上的背景图合并成一张,然后通过css的background-position属性定义不过的值来取他的背景。淘宝和阿里巴巴中文站目前都是这样做的。有兴趣的可以看下淘宝和 阿里巴巴的背景图
http://www.csssprites.com/  这是个工具网站,它可以自动将你上传的图片合并并给出对应的background-position坐标。并将结果以png和gif的格式输出。
第二条、使用CDN(内容分发网络):  Use a Content Delivery Network
说实话,对于CDN这一块自己并不是很了解,简单地讲,通过在现有的Internet中增加一层新的网络架构,将网站的内容发布到最接近用户的cache服务器内,通过DNS负载均衡的技术,判断用户来源就近访问cache服务器取得所需的内容,杭州的用户访问近杭州服务器上的内容,北京的访问近北京服务器上的内容。这样可以有效减少数据在网络上传输的时间,提高速度。更详细地内容大家可以参考百度百科上对于 CDN 的解释。Yahoo! 把静态内容分布到 CDN 减少了用户影响时间 20% 或更多。
CDN技术示意图:
cdn-tech.jpg 


CDN组网示意图:
cdn-status.jpg 

第三条、 添加Expire/Cache-Control 头 :Add an Expires Header
现在越来越多的图片,脚本,css,flash被嵌入到页面中,当我们访问他们的时候势必会做许多次的http请求。其实我们可以通过设置Expires header来缓存这些文件。Expire其实就是通过header报文来指定特定类型的文件在览器中的缓存时间。大多数的图片,flash在发布后都是不需要经常修改的,做了缓存以后这样浏览器以后就不需要再从服务器下载这些文件而是而直接从缓存中读取,这样再次访问页面的速度会大大加快。一个典型的HTTP 1.1协议返回的头信息:
HTTP/1.1 200 OK
Date: Fri, 30 Oct 1998 13:19:41 GMT
Server: Apache/1.3.3 (Unix)
Cache-Control: max-age=3600, must-revalidate
Expires: Fri, 30 Oct 1998 14:19:41 GMT
Last-Modified: Mon, 29 Jun 1998 02:28:12 GMT
ETag: “3e86-410-3596fbbc”
Content-Length: 1040
Content-Type: text/html
其中通过服务器端脚本设置Cache-Control和Expires可以完成。
如,在php中设置30天后过期:
<!--pHeader("Cache-Control: must-revalidate");$offset = 60 * 60 * 24 * 30;$ExpStr = "Expires: " .gmdate("D, d M Y H:i:s"time() + $offset) . " GMT";Header($ExpStr);--> <!?pHeader(”Cache-Control:must-revalidate”);$offset = 60 * 60 * 24 * 30;$ExpStr = “Expires: ” .gmdate(”D, d M Y H:i:s”, time() + $offset) . ”GMT”;Header($ExpStr);?>
在asp中设置绝对时间过期:
<% Response.ExpiresAbsolute=#May 31,2010 13:30:15 GMT# %>
也可以通过配置服务器本身完成,这些偶就不是很清楚了,呵呵。想了解跟多的朋友可以参考 http://www.web-caching.com/
据我了解,目前阿里巴巴中文站的Expires过期时间是30天。不过期间也有过问题,特别是对于脚本过期时间的设置还是应该仔细考虑下,不然相应的脚本功能更新后客户端可能要过很长一段时间才能“感知”到这样的变化。以前做[ suggest项目 ] 的时候就遇到过这个问题。所以,哪些应该缓存,哪些不该缓存还是应该仔细斟酌一番。
第四条、启用Gzip压缩: Gzip Components
Gzip的思想就是把文件先在服务器端进行压缩,然后再传输。这样可以显著减少文件传输的大小。传输完毕后浏览器会重新对压缩过的内容进行解压缩,并执行。目前的浏览器都能“良好”地支持gzip。不仅浏览器可以识别,而且各大“爬虫”也同样可以识别,各位seoer可以放下心了。而且gzip的压缩比例非常大,一般压缩率为85%,就是说服务器端100K的页面可以压缩到25K左右再发送到客户端。具体的Gzip压缩原理大家可以参考csdn上的《 gzip压缩算法 》 这篇文章。雅虎特别强调,  所有的文本内容都应该被gzip压缩: html (php), js, css, xml, txt…  这一点我们网站做得不错,是一个A。以前我们的首页也并不是A,因为首页上还有很多广告代码投放的js,这些广告代码拥有者的网站的js没有经过gzip压缩,也会拖累我们网站。
以上三点大多属于服务器端的内容,本人也是粗浅地了解而已。说得不对的地方有待各位指正。
第五条、将css放在页面最上面  ( Put Stylesheets at the Top)
将css放在页面最上面,这是为什么?因为ie,firefox等浏览器在css全部传输完全之前不会去渲染任何的东西。理由诚如小马哥说得那样很简单。css,全称CascadingStyle Sheets (层叠样式表单)。层叠即意味这后面的css可以覆盖前面的css,级别高的css可以覆盖级别低的css。在[css之!important] 这篇文章的最下面曾简单地提到过这层级关系,这里我们只需要知道css可以被覆盖的。既然前面的可以被覆盖,浏览器在他完全加载完毕之后再去渲染无疑也是合情合理的很多浏览器下,如IE,把样式表放在页面的底部的问题在于它禁止了网页内容的顺序显示。浏览器阻止显示以免重画页面元素,那用户只能看到空白页了。Firefox不会阻止显示,但这意味着当样式表下载后,有些页面元素可能需要重画,这导致闪烁问题。所以我们应该尽快让css加载完毕
顺着这层意思,如果我们再细究的话,其实还有可以优化的地方。比如本站上面包含的两个css文件,<link rel=“stylesheet” rev=“stylesheet” href=“http://www.space007.com/themes/google/style/google.css” type=“text/css” media=“screen” /> 和<link rel=“stylesheet” rev=“stylesheet” href=“http://www.space007.com/css/print.css” type=“text/css” media=“print” />。从media就可以看出第一个css是针对浏览器的,第二个css文件是针对打印样式的。从用户的行为习惯上来将,要打印页面的动作一定是发生在页面页面显示出来之后的。所以比较好的方法应该是在页面加载完毕之后再动态地为这张页面加上针对打印设备的css,这样又可以提高一点速度。(哈哈)
第六条、将script放在页面最下面 (Put Scripts at the Bottom )
将脚本放在页面最下面的目的有那么两点: 1、因为防止script脚本的执行阻塞页面的下载。在页面loading的过程中,当浏览器读到js执行语句的时候一定会把它全部解释完毕后在会接下来读下面的内容。不信你可以写一个js死循环看看页面下面的东西还会不会出来。(setTimeout 和setInterval的执行有点类似于多线程,在相应的响应时间之前也会继续下面的内容渲染。)浏览器这么做的逻辑是因为js随时可能执行 location.href或是其他可能完全中断此页面过程的函数,即如此,当然得等他执行完毕之后再加载咯。所以放在页面最后,可以有效减少页面可视元素的加载时间。        2、 脚本引起的第二个问题是它阻塞并行下载数量。HTTP/1.1规范建议浏览器每个主机的并行下载数不超过2个(IE只能为2个,其他浏览器如ff等都是默认设置为2个,不过新出的ie8可以达6个)。因此如果您把图像文件分布到多台机器的话,您可以达到超过2个的并行下载。但是当脚本文件下载时,浏览器不会启动其他的并行下载。
当然对各个网站来说,把脚本都放到页面底部加载的可行性还是值得商榷的。就比如阿里巴巴中文站的页面。很多地方有内联的js,页面的显示严重依赖于此,我承认这和无侵入脚本的理念相差甚远,但是很多“历史遗留问题”却不是那么容易解决的。
第七条、避免在CSS中使用Expressions (Avoid CSS Expressions )
css表达是的执行次数是远远多于我们想象的,往往会严重地影响性能。而且,它只能在IE中执行。所以因尽量地避免它。这一条以前倒没想过,个人用这个就是在对ie使用max-width和min-width属性的时候。大家知道IE是不支持max-width和min-width属性的。有时候的页面(特别是自适应大小的页面)为了能在分辨率小到一定程度后还能显示要用到这个功能,怎么办。当时我的做法就是利用expressions:
min-width : 952px width :expression((document.documentElement.clientWidth &lt; 952  ) ? &quot; 952 &quot;:&quot; auto &quot;)  min-width:952px; width:expression((document.documentElement.clientWidth <952 ) ? “952″:”auto”) 
不过从今天应该寻找新的办法了。目前的解决办法是通过两层的嵌套:
css文件:
#main _box{ width : 70% ; height : 100px background : #ffffcc min-width : 600px ; margin : auto ; } #p_main_box{ border-left : 600px   solid   #ffffcc height : 1px ; } #m_main_box{  margin-left :- 600px position : relative height : 1px ; text-align : center ; } #main_box{width:70%;height:100px;background:#ffffcc; min-width:600px;margin:auto; } #p_main_box{border-left:600px solid #ffffcc; height:1px; } #m_main_box{margin-left:-600px; position:relative; height:1px; text-align:center; }
html文件:
</p><div  id = "main_box" ><div  id = "p_main_box" ><div  id = "m_main_box" > 最小宽度600px; </div></div></div><p >
</p><divid=”main_box”><div id=”p_main_box”><divid=”m_main_box”>最小宽度600px;</div></div></div><p&amp; gt;
不过这样就多了两层无意义的嵌套,肯定不好。还需要一个更好的办法。

第八条、把javascript和css都放到外部文件中(Make JavaScript and CSS External )
这点我想还是很容易理解的。不仅从性能优化上会这么做,用代码易于维护的角度看也应该这么做。把css和js写在页面内容可以减少2次请求,但也增大了页面的大小。如果已经对css和js做了缓存,那也就没有2次多余的http请求了。当然,我在前面中也说过,有些特殊的页面开发人员还是会选择内联的css和js文件。
第九条、减少DNS查询 (Reduce DNS Lookups) 
在Internet上域名与IP地址之间是一一对应的,域名(kuqin.com)很好记,但计算机不认识,计算机之间的“相认”还要转成ip地址。在网络上每台计算机都对应有一个独立的ip地址。在域名和ip地址之间的转换工作称为域名解析,也称DNS查询。一次DNS的解析过程会消耗20-120毫秒的时间,在dns查询结束之前,浏览器不会下载该域名下的任何东西。所以减少dns查询的时间可以加快页面的加载速度。yahoo的建议一个页面所包含的域名数尽量控制在2-4个。这就需要对页面整体有一个很好的规划。目前我们这点做的不好,很多打点的广告投放系统拖累了我们。
第十条、压缩 JavaScript 和 CSS (Minify JavaScript ) 
压缩js和css的左右很显然,减少页面字节数。容量小页面加载速度自然也就快。而且压缩除了减少体积以外还可以起到一定的保护左右。这点我们做得不错。常用的压缩工具有JsMin、YUI compressor等。另外像http://dean.edwards.name/packer/还给我们提供了一个非常方便的在线压缩工具。你可以在jQuery的网页看到压缩过的js文件和没有压缩过的js文件的容量差别:

当然,压缩带来的一个弊端就是代码的可读性没了。相信很多做前端的朋友都遇到过这个问题:看Google的效果很酷,可是去看他的源代码却是一大堆挤在一起的字符,连函数名都是替换过的,汗死!自己的代码也这样岂不是对维护非常不方便。所有阿里巴巴中文站目前采用的做法是在js和css发布的时候在服务器端进行压缩。这样在我们很方便地维护自己的代码。
第十一条、避免重定向(Avoid Redirects ) 

不久前在ieblog上看到过《Internet Explorer and Connection Limits》这篇文章,比如 当你输入http://www.bt285.cn 的时候服务器会自动产生一个301服务器转向 http://www.5a520.cn ,你看浏览器的地址栏就能看出来。这种重定向自然也是需要消耗时间的。当然这只是一个例子,发生重定向的原因还有很多,但是不变的是每增加一次重定向就会增加一次web请求,所以因该尽量减少。
第十二条、移除重复的脚本(Remove Duplicate Scripts ) 
这点我想不说也知道,不仅是从性能上考虑,代码规范上看也是这样。但是不得不承认,很多时候我们会因为图一时之快而加上一些或许是重复的代码。或许一个统一的css框架和js框架可以比较好的解决我们的问题。小猪的观点很对,不仅是要做到不重复,更是要做到可重用。
第十三条、配置实体标签(ETags)(Configure ETags ) 
这点我也不懂,呵呵。在inforQ上找到一篇解释得比较详细的说明《使用ETags减少Web应用带宽和负载》,有兴趣的同学可以去看看。
第十四条、使 AJAX 缓存 (Make Ajax Cacheable ) 
ajax还要去缓存?做ajax请求的时候往往还要增加一个时间戳去避免他缓存。It’s important to rememberthat “asynchronous” does not imply“instantaneous”.(记住“异步”不是“瞬间”这一点很重要)。记住,即使AJAX是动态产生的而且只对一个用户起作用,他们依然可以被缓存。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_866718.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

3个网站测速服务

访问速度对于一个网站或博客来说实在太重要了&#xff0c;据有关部门的估计&#xff1a;一般一个浏览者如果在5-8秒钟没有打开一个网站&#xff0c;那么该网站会丢失1/3的浏览用户。超过10秒&#xff0c;你的访客绝对会失去耐心&#xff01;今天不讲如何改进访问速度的问题&…

网站备案流程_网站备案需要什么

每次写文章的时候都想感慨一句又好久没写文章了&#xff0c;这次也不例外。其实很多次都想写点什么&#xff0c;可是每次都犹豫不决&#xff0c;因为每次写个文章都挺费脑子的而且我容易闲扯&#xff0c;然后又是一大堆&#xff0c;就像我这段话。 关于备案&#xff0c;我折腾过…

如何完美更换WordPress网站的域名

前几天&#xff0c;一位WordPress王牌主机的用户问我&#xff0c;他的WordPress网站已经建立一年多了&#xff0c;现在想要修改网站使用的域名&#xff0c;该如何操作&#xff1f;这是WordPress用户经常遇到的问题。今天我们来给大家介绍一下&#xff0c;如何更换WordPress网站…

【chrome】安装证书并配置为受信任网站连接(windows)

当出现网站连接非私密连接不受信任时&#xff0c;可添加证书crt文件到系统证书里设置为受信任 1、chrome设置中&#xff0c; 高级-- 管理证书 2、选择 受信任的根证书颁发机构 -- 导入 3、下一步 找到所需要配置的*.crt证书文件&#xff0c;双击安装证书&#xff0c;选择第二…

JSP的Servlet与Tomcat,java面试题库网站

JSP的输出表达式(<% …%>部分)&#xff0c;输出表达式会转换成Servlet的xxxService()方法里的输出语句。 九个内置对象要么是xxxService()方法的形参&#xff0c;要么是该方法的局部变量&#xff0c;所以九个内置对象只能在JSP脚本和输出表达式中使用。// 不能在jsp Dec…

如何查网站的外链与索引量?

如何查网站的外链&#xff1f; 接下来向SEO新手重点介绍做SEO经常要查询的指令和方法&#xff0c;如查询外链、收录量等&#xff0c;由此可知SEO的进展效果。如果要查百度外链&#xff0c;可以在百度输入“domain”指令加上要查询的网站域名。比如&#xff0c;输入“domain:…

如何才能制定出可行的SEO执行方案?

前面的几篇文章分析了用户需求&#xff0c;等于知道了SEO优化的方向&#xff0c;至少大概知道了自己应该提供哪些内容给用户了。但是&#xff0c;是不是用户什么需求都要去满足呢&#xff1f;答案是否定的。因为还得看看自己有没有能力满足用户需求&#xff0c;以及竞争对手是不…

SEO如何优化让用户喜欢上网站标题

网站的标题是用于告诉用户和搜索引擎该网页的主要内容是什么&#xff0c;百度在判断一个网站是否在某个关键词上有排名&#xff0c;标题是主要的参考信息之一。 网站在进入前20名之前&#xff0c;用户基本上没有机会看到标题&#xff0c;所以标题对于用户的价值不高&#xff…

网站微调是什么意思?能带来什么作用?

在前面&#xff0c;我们了解到了网站微调的重要性&#xff0c;江西SEO曾庆平接下来讲解网站微调具体要做什么工作。很多SEO人员也都听说过微调&#xff0c;只不过大部分的SEO人员都是站在整个网站的角度进行微调。实际上这里所说的微调仅仅是针对一个页面而已。 什么是微调&…

SEO中什么是微创新?

微调是根据用户需求对网页进行特定的调整&#xff0c;但是假如竞争对手与我们都注意到这个优化细节&#xff0c;并且也掌握了微调的技巧的时候&#xff0c;就需要通过微创新来进行竞争了&#xff0c;否则大家的优化方式都一样&#xff0c;百度凭什么把我们网站排在前面呢。 什么…

SEO后期如何挖掘和满足用户的需求?

网站越到SEO后期&#xff0c;用户体验对于排名的影响越大。因此。SEO人员在日常的工作中必须时刻了解用户需求的变动&#xff0c;避免用户需求改变了&#xff0c;网站却没有跟上调整&#xff0c;最终导致网站排名下降。 挖掘并满足用户需求 为了随时了解用户的最新需求&#xf…

网站后期工作内容更新与外链发布的规则

内容更新 在网站的后期&#xff0c;网站内容的更新依然是根据用户需求来进行。大部分SEO教程会告诉SEO人员&#xff0c;每天要固定更新多少篇文章才可以&#xff0c;只有天天更新的网站才能获得排名&#xff0c;其实这些观点是错误的。 更新的条件在于用户的需求&#xff0c;如…

SEO如何要做好网站的安全防范工作

网站安全一直是很多SEO人员忽略的问题。在深圳SEO精英交流QQ群里&#xff08;109450372&#xff09;&#xff0c;江西SEO曾庆平都能看到很多站长遭受到网站被黑被挂码的困扰&#xff08;本人之前也是经常深受被人黑的烦恼&#xff0c;人怕出名&#xff0c;猪怕壮&#xff09;。…

SEO人员一定要坚持SEO之道

至此&#xff0c;江西SEO曾庆平前面的SEO文章就把一个网站做 SEO优化的前期、中期、后期的工作内容都讲解完了。我们可以看到&#xff0c;SEO其实是一个系统的工程&#xff0c;绝非简单的做文章、发外链。运营一个网站其实就和做企业是一样的。只有为用户考虑&#xff0c;并且…

如何搭建一个移动端的网站?

了解了为什么要做移动端SEO&#xff0c;接下来开始讲具体的操作方法。不过做移动端的SEO&#xff0c;针对的就不会是PC端的网站了&#xff0c;需要重新搭建单独的移动端网站。所以&#xff0c;下面江西SEO曾庆平介绍如何搭建移动端的网站。 1、域名 一般来说&#xff0c;做移动…

如何让织梦网站内页中的文章显示浏览多少次 ?

织梦dedecms内容页调用点击量的方法&#xff1a;曾庆平虽然用织梦好几年了&#xff0c;也做了N多网站了&#xff0c;但是这么多网站中从来都没有用过内容页调用点击率的方法&#xff0c;这一点也很汗颜&#xff0c;虽然很简单&#xff0c;但是对大家应该也有帮助。有朋友会说&a…

移动端SEO之用户体验优化提升方法

移动端SEO之用户体验优化&#xff0c;前面一篇江西SEO曾庆平讲完了 移动站响应式的实现&#xff0c;我们再扩展一下&#xff0c;看看移动端网站还可以在哪些用户体验上面做提升。 1、一键拨号 如果需要在移动浏览器中实现一键拨号的功能&#xff0c;移动手机Web页面JS提供了一…

移动端网站为什么要做地理信息标注?

地理信息标注是为了方便用户根据自身位置查找或使用本地信息与服务&#xff0c;百度移动搜索将根据用户地理位置信息优先将具有地域属性的内容展现给用户。如果网站是提供地域性信息服务的站点&#xff0c;可以通过为自己网页添加地理位置信息的meta标注&#xff0c;让目标用户…

百度移动端网站优化问题集锦(一)

移动网站兴起时间不长&#xff0c;很多的SEO人员都有相似的问题。早在2014年11月份的百度移动搜索沙龙上&#xff0c;百度移动专家针对站长提问较多的问题进行了统一回答&#xff0c;与往期沙龙的零星回答合并整理如下。 问&#xff1a;我的移动站内容和PC站是一样的&#xff0…

百度移动端网站优化问题集锦(二)

前面一篇江西SEO曾庆平讲了《 百度手机移动站SEO常见问题汇总集锦》&#xff0c;咱们继续讲移动端SEO常见问题二&#xff1a; 问:在百度移动搜索上我的移动站点与PC站夹杂&#xff0c;怎么让搜索引擎优先展示移动站点&#xff1f; 答:首先&#xff0c;最好在自己网站下做好自适…