由于水平有限,针对该网站所作的测试肯定存在不科学、不合理的地方,不当之处请谅解。本文仅供相关技术参考之用。
内容再丰富的网站,如果慢到无法访问也是毫无意义的;SEO做的再好的网站,如果搜索蜘蛛抓不到也是白搭;UE设计的再人性化的网站,如果用户连看都看不到也是空谈。
Web应用性能优化黄金法则:先优化前端程序(front-end)的性能,因为这是80%或以上的最终用户响应时间的花费所在。(详情请看:雅虎网站前端网页优化的14条原则)
1.YSlow评级
Chrome浏览器的网络模块进行人工观察与分析,难免会有效率低下、分析不全面的问题。因此应当使用自动化的工具进行更深入的分析。
YSlow是雅虎公司开发的一个对网站前端性能进行分析的插件,最初作为Firefox浏览器的插件发布,后来也陆续有了Chrome等浏览器的插件。这里使用Firefox下的YSlow插件对指挥旅游首页性能进行分析。
在23个评级规则中,有4条未能达到A或B级(A意味着性能最优,F意味着有必要进行深入优化),它们应作为网站前端性能优化的主要入手点,分别是:
① F:减少HTTP请求次数
② C:使用内容分发网络(CDN)
③ F:添加较长的Expires头
④ F:使用gzip压缩组件
⑤ E:压缩javascript和CSS
⑥ F:Use cookie-free domains,使用无cookie的域名
2.采取的前端性能优化技术
1.使用Grunt、gulp、webpack等自动化构建工具来压缩合并组件。
2.服务器开启Gzip压缩。
3.图片压缩与拼接、再把图片拼接:CSS Sprites(把小图标合并成一张大图);
3.页面体积与加载时间
3.1页面体积
浏览器视口分辨率:1920×746像素。图片的优化只是针对HTTP请求次数,其前后尺寸变化不大,因此暂不考虑优化前后的差别。JavaScript请求数量“*+4”表示其中4个请求来自其他域(主要是搜狗地图服务)。
优化前后文件体积压缩率 = 优化后的体积÷优化前的体积
文件压缩之后究竟应该多大才算合适?目前也无定论,只能根据经验来判断。合并后的文件如果太大,则对单个文件的下载、解析、执行的耗时就越长(当然,随着浏览器能力的不断提升,这个时间相比于网络传输时间仍是小量)。《Web性能权威指南》里提到:
谷歌PageSpeed团队的测试表明,30~50KB(压缩后)是每个JavaScript文件大小的合适范围:既大道了能够减少小文件带来的网络延迟,还能确保递增及分层式的执行。
3.2页面加载时间
10Mb带宽下,操作系统Windows 8 x64,内存8GB,CPU Intel i5,屏幕分辨率1366×768像素,使用Chrome浏览器(主版本号38)于2014-12-25 21:08至21:45,每隔1~2分钟对网站主页面/main.jsp进行无缓存加载时间测试(每次刷新页面之前,都先执行清空浏览器缓存的操作);同时,也对第二次加载的时间进行了记录,以作为有无缓存的性能对比。详细结果如图 4所示。由图可见,经过优化后,页面无缓存的情况下完全加载时间为3.31秒,比优化之前减少了一个数量级,加载速度有很明显的提升。
4.总结与展望
网站前端性能优化中最首要的原则是:优先针对瓶颈进行优化。所谓瓶颈,乃是制约性能的最关键因素。对于网站,其第一瓶颈为Gzip压缩未开启。开启压缩之后的瓶颈,则是组件未压缩。对于中小型网站来说,解决了前几个瓶颈问题,性能问题也就解决了一大半。
YSlow评级仍为3个方面给出F评分:
① F:减少HTTP请求次数;
② F:添加较长的Expires头;
③ F:Use cookie-free domains,使用无cookie的域名。
其中,①是仍需继续优化的方面;至于②,由于使用的CDN和搜狗地图服务对其资源并未添加Expires头,导致本项评分较低,但本域下的资源的Expires头都已经符号符合其评判标准了;而对于②,由于目前服务器只申请了一个域名,静态资源大都从该域名下获取,导致评分较低。这些都是未来可以进一步开展优化的方面。
浏览器执行“每个服务端最大连接数”的限制是根据URL上的主机名,而不是解析出来的IP地址。这对那些想把内容分配到多个域的人来说是个好消息,他们不必额外部署服务器,而是为新域建立一条CNAME记录。CNAME仅仅是域名的一个别名。即使域名都指向同一个服务器,浏览器依旧会为每个主机名开放最大连接数。——《高性能网站建设进阶指南》
目前很多网站的常见做法是分离图片,即让网站的文本资源从域1下载的同时,让所需的全部图片资源从域2开始并行下载
[1]. Steve Souders. High Performance Web Sites [M].
[2]. YSlow官网,http://yslow.org/
[3]. Grunt中文网,http://www.gruntjs.net/
[4]. Gulp官网,http://www.gulpjs.com.cn/
[5]. webpack中文网,http://webpackdoc.com/