提升网站页面速度的14条最佳实践

更新日期: 2019-05-21阅读: 1.7k标签: 优化

《高性能网站建设指南》一书共列举了14条提升网站速度的方法。性能黄金法则:只有10%-20%的最终用户响应时间花在了下载html文档上,其余80%-90%时间花在了下载页面中的所有组件上。  


一、减少http请求

1.图片地图
2.css Sprites
3.内联图片 
4.合并脚本和样式表


二、使用内容发布网络

内容发布网络(CDN)是一组分布在不同地理位置的web服务器,用于更加有效地像用户发布内容。即利用就近原则,响应发送给用户需要的数据,进而缩短响应时间,来提高网站性能。


三、添加Expires头

浏览器(和代理)使用缓存来减少HTTP请求的数量,并减少HTTP响应的大小,使web页面加载得更快。web服务器使用Expires头来告诉web客户端它可以使用一个组件的当前副本。

注意:Expires头使用的是一个特定的时间,它要求客户端与服务器的时钟严格同步,一旦两个时间统一,Expires头的时间将没有意义。

为了解决Expires头的限制,HTTP1.1 引入了Cache-Control使用max-age指令指定组件缓存多久。它以秒为单位定义更新窗。如果从组件请求开始过去的秒数小于max-age,浏览器就可以使用缓存的版本。

注意: 
 1.在小于HTTP1.1版本之前仍需要设置Expires头,为了做更好的兼容,最好同时使用HTTP1.1和max-age,在支持max-age的版本中,如果两者同时存在max-age会重写Expires头。 
 2.利用Apache模块mod_expires可以使Expires头能够像max-age那样以相对的方式设置日期。通过Expires_Default指令来实现。时间可以用年/月/周/日/时/分/秒为单位来设置。


四、压缩组件

1.从HTTP1.1开始,web客户端可以通过HTTP请求中的Accept-Encoding头来识别对压缩的支持。
Accept-Encoding:gzip,deflate;
2.配置
a.Apache1.3的gzip压缩由mod_gzip模块提供
b.Apache2.x中压缩通过mod_deflate模块来完成。
3.代理缓存
在Web服务器的响应中添加Vary头。Web服务器可以告诉代理根据一个或者多个请求头来改变缓存的响应。
Vary:Accept-Encoding
这种情况下代理服务器会缓存每个响应的两个版本——Accept-Encoding为gzip时的压缩内容和没指定Accept-Encoding时的非压缩内容。


五、将样式表放在顶部

由于浏览器总是在样式表加载并解析完之后才会绘制页面内容,所以把样式表放在底部才会出现白屏或者无样式内容的闪烁问题。


六、将脚本放在页面底部

浏览器总是从上到下执行页面内容,如果将脚本放置在页面顶部,则在加载脚本的这段时间内,页面的内容呈现将被阻塞!


七、避免css表达式

css表达式也会影响页面的加载时间。如果必须要在页面加载记载的时候对css样式进行重置,可以考虑使用时间处理器来代替css表达式。


八、使用外部Jacascript和css

1.如果需要呈现给用户的页面可以实现完整缓存,那么使用外部Jacascript和css会提高网站性能。
2.在使用使用外部Jacascript和css时,可以设置页面加载完成后下载,这样可保证页面也首屏效果。


九、减少DNS查询

1.Internet是通过IP地址来查找服务器的。由于IP地址很难记忆,通常使用包含主机名的URL来取代它,但是浏览器发送请求时,IP地址仍然是必需的。这就是domain Name System(DNS)所处的角色,DNS将主机名映射到IP地址上。当你输入一个网址时,链接到服务器的DNS解析器会返回服务器的IP地址。
2.DNS开销:通常浏览器查找的一个给定的主机名的IP地址要花费20-120毫秒,在完成查找之前,浏览器不能从主机那里下载任何的东西。
3.使用Keep-Alive和较少的域名来减少DNS查询


十、精简JavaScript

精简是从代码中移除不必要的字符,比如空白符(空格、换行、制表符)等以减少文件大小,进而改善加载时间。


十一、避免重定向

1.重定向用于将用户从一个url重新路由到另一个url。重定向有很多种:301和302是常见的两种
2.当Web服务器向浏览器返回一个重定向时,响应中就会拥有一个范围在3xx的状态码(注意:"304 Not Modeified"并不是真的重定向-他是用来响应GET请求,避免下载已经存在于浏览器缓存中的数据。)。
3.重定向的损伤:在重定向完毕并且HTML文档下载完成之前,没有任何东西显示给用户。


十二、移除重复脚本

重复性脚本损伤性能的方式有两种:不必要的HTTP请求和执行JavsScript所浪费的时间。


十三、配置或移除ETag

1.Etag是什么?
实体标签(Entity Tag ETag)是Web服务器和浏览器用于确认缓存组件的有效性的一种机制。
2.浏览器的缓存与确认?
步骤一:Expires头:浏览器在下载组件时,会将它存储到缓存中。再次请求改组件时,会确认改组件是否过期来决定是否重新请求改组件,而这个过期时间是由Expires头的值来决定。当请求一个组件时,服务器会根据其选项在响应中返回一个Expires头。
步骤二:条件GET请求:如果缓存的组件过期了(或者用户明确地重新记载了页面),浏览器在重用它之前必须首先检查它是否仍然有效,这称作条件GET请求。如果组件有效,原始服务器会返回一个"304 Not Modified"状态码。

服务器在检测缓存的组件是否有效时有两种方式: 1.比较最新修改日期 2.比较实体标签  

2.1 最新修改时间:

原始服务器通过Last-Modified响应头来返回组件的最新修改时间,它要求服务器端和客户端时间完全统一的情况下才有意思。  

2.1 实体标签:

 ETag提供了另一种方式,用于检测浏览器缓存中的组件与原始服务器上的组件是否匹配。ETag在HTTP1.1中引用。ETag是唯一标识了一个组件的一个特定版本的字符串。唯一的格式约束是该字符串必须用引号引起来。原始服务器使用ETag来响应指定组件的Etag。 Etag为验证实体提供了比修改最新日期更为灵活的机制,例如,如果实体依据User-Agent或者Accept-Language头而改变,实体的状态可以反映在ETag中。此后,如果浏览器必须验证一个组件,它会使用If-None-Match头将ETag传回原始服务器。如果ETag是匹配的,就会返回304状态吗。  

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

3.1 Apache1.3和2.X的ETag格式是inode-size-timestamp,即使文件系统的所有信息都是一致的,但是不同服务器上的inode仍然是不同的。

3.2 IIS5.0和6.0在ETag上有着类似的问题。IIS上ETag的格式是Fletimestamp:ChangNumber。ChangNumber适用于跟踪IIS配置变化的计数器。对于网站背后的服务器来说,ChangNumber不大相同。
3.3 最后结果,对于完全相同的组件,从一台服务器到另一台Apache和 IIS产生的ETag是不同的,如果你使用了服务器集群,使用ETag会造成组件不必要的重复加载并影响服务器的性能、增加宽带的开销。

4.ETag用还是不用?
如果你使用的是服务器集群,且使用默认的ETag配置,你的用户将面对缓慢的页面,你的服务器会有很高的负载,你会消耗大量的带宽,而且代理也不能有效地缓存你的内容。

为了使用ETag的灵活性的验证能力而又要消除其所带来的问题,有一种选择是对ETag进行自定的配置。比如可以使用一段根据浏览器是否为Internet Explorer而变化的脚本。如果使用php来生成脚本,你可以通过设置ETag头来反映浏览器的状态。 如果你的组件必须通过最新修改日期之外的一些东西来进行验证,则自定义ETag是一种强大的方法。如果你不能自定义ETag,建议你移除ETag。 

 

十四、使用Ajax可缓存

公所周知,主动的Ajax请求时异步的,用户可能仍然需要等待响应。不过用户不必忍受整个页面的重新加载了,而且用户在等待时,UI仍然可以响应。
由于Ajax毕竟是一个请求,所有为更好的用户体验,我们仍需结合上面其他的性能优化条例来使用,比如缓存等。


链接: https://www.fly63.com/article/detial/3387

js中for循环优化总结_如何提高程序的执行效率

在程序开发中,经常会使用到for循环的,但是很多人写的for循环效率都是比较低的,下面就举例说明,并总结优化for循环的方法,来提高我们程序的执行效率。

网站打开速度优化_如何提高网页访问速度技巧方法总结

网站的加载速度不仅影响着用户体验,也会影响搜索引擎的排名,在百度推出“闪电算法”以来,将网站首屏打开速度被列入优化排名行列,作为前端开发的我们需要如果来优化网站的打开速度呢?下面就整理挖掘出很多细节上可以提升性能的东西分享给大家

JS性能优化之文档片段createDocumentFragment

DocumentFragments是DOM节点。它们不是主DOM树的一部分。通常的用例是创建文档片段,将元素附加到文档片段,然后将文档片段附加到DOM树。在DOM树中,文档片段被其所有的子元素所代替。因为文档片段存在于内存中,并不在DOM树中

深入浅出代码优化﹣if/else

对于代码裡面的 if else,我们可以使用逻辑判断式,或更好的三元判断式来优化代码。除了可以降低维护项目的成本之外,还可以提升代码可读性。就让我们从最简单的 if else 例子开始吧。

微信小程序性能优化入门指南

小程序从发布到现在也已经有将近两年的时间,越来越来多的公司开始重视小程序生态带来的流量,今年也由于小程序平台对外能力的越来越多的开放以及小程序平台的自身优化,越来越多的开发者也自主的投入到小程序的开发当中

网络串流播放_HTML5如何优化视频文件以便在网络上更快地串流播放

无论你正在将 GIF 动图转换为 MP4 视频,还是手头已经有一大堆 MP4 视频,你都可以优化文件结构,以使得这些视频更快地加载和播放。通过重组 atoms 将 moov 放到文件开头,浏览器可以避免发送额外的 HTTP range request 请求来搜寻和定位 moovatom

​web项目优化_Web 服务器性能与站点访问性能优化

要优化 Web 服务器的性能,我们先来看看 Web 服务器在 web 页面处理上的步骤:Web 浏览器向一个特定的服务器发出 Web 页面请求; Web 服务器接收到 web 页面请求后,寻找所请求的 web 页面,并将所请求的 Web 页面传送给 Web 浏览器; 显示出来

前端性能优化之重排和重绘

浏览器下载完页面所有的资源后,就要开始构建DOM树,于此同时还会构建渲染树(Render Tree)。(其实在构建渲染树之前,和DOM树同期会构建Style Tree。DOM树与Style Tree合并为渲染树)

微信小程序代码优化总汇

写篇文章的目的,是以开放小程序代码的层面的优化。包括:条件判断将wx:if换成了hidden 、页面跳转请销毁之前使用的资源、列表的局部更新、小程序中多张图片懒加载方案、Input状态下隐藏input,应预留出键盘收起的时间

我是如何将页面加载时间从6S降到2S的?

生活在信息爆炸的今天,我们每天不得不面对和过滤海量的信息--无疑是焦躁和浮动的,这就意味着用户对你站点投入的时间可能是及其吝啬的(当然有一些刚需站点除外)。如何给用户提供迅速的响应就显得十分重要了

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!