本文是Web前端性能优化系列文章中的第五篇,主要讲述内容:网站样式和脚本代码的放置位置、使用外部javascript和css。完整教程可查看:Web前端性能优化

一、将样式表放在顶部

可视性回馈的重要性

进度指示器有三个主要优势——它们让用户知道系统没有崩溃,只是正在为他或她解决问题;它们指出了用户大概还需要等多久,以便用户能够在漫长的等待中做些其他事情;最后,它们能给用户提供一些可以看的东西,使得等待不再是那么无聊。最后一点优势不可低估,这也是为什么推荐使用图形进度条而不是仅仅以数字形式显示预期的剩余时间。在Web的世界里,Html页面的逐步呈现就是很好的进度指示器。

将没有立即使用的css放在底部是错误的做法

通常组件的下载是按照文档中出现的顺序下载的,所以将不需要立即使用到的组件css(比如需要用户点击登录弹出框需要用到的样式)放在底部,可以得到一个加载很快的页面。然而这个推论其实是错误的,IE8以下(包括IE8)的工作方式是如果css表仍在加载,构建呈现树就是一种浪费,因为在所有样式表加载并解析完毕之前无需绘制任何东西,这时整个浏览器显示都是空白,直到css加载完毕,这就失去了提供可视化回馈的机会,让用户感觉到缓慢。

不过,更高级版本的IE和其他浏览器已经克服了“白屏”问题,所以这种情况已经不复存在。

无样式内容的闪烁

这里将讨论另外一种出现的情况,当我们将css放在底部,页面可以正常逐步呈现,但在css下载并解析完毕之后,已经呈现的文字和图片就要用新的样式重绘了,这就是“无样式内容的闪烁”,这将是一种不好的用户体验。

CSS的最佳摆放位置

使用LINK标签将样式表放在文档HEAD中。

二、将脚本放在底部

并行下载

浏览器下载组件的时候并不是每次只下载一个组件,而是实现了并行下载的机制。HTTP规范1.1建议浏览器从每个主机名并行地下载两个组件。既假如页面的所有组件都来自于一个主机名,则每次只能同时下载两个组件。如果组件使用了两个主机名,而且组件的主机名分配均匀,则每次并行下载的数量变成了2*2=4。不过,当代的浏览器普遍实现都超过了2个并行下载,不同的浏览器设置都有所不同。

脚本阻塞下载

并行下载组件能加快页面的加载速度,然而,在下载脚本的时候并行下载实际上是被禁用的,即使其他组件使用了不同的主机名,浏览器也不会启动其他的下载。原因如下:1. 脚本可能使用了document.write来修改页面内容,因此浏览器会等待,以确保能够恰当地布局;2. 为了保证脚本能够按照正确的顺序执行,如果并行下载多个组件,就无法保证响应是按照特定顺序到达浏览器的。

所以,脚本放在越靠近顶部的地方将越延迟用户的可视化反馈,这不是一种良好的用户体验,会让用户感觉到缓慢。

最佳做法

放置脚本的最好地方是页面的底部,这不会阻止页面内容的呈现,而且页面的可视化组件可以尽早下载。以博客园为例,博客园就把google流量分析的js放在底部,同时把下载Blog新闻和Blog侧边栏的js执行函数放在了底部。

三、使用外部javascript和css

基础知识

页面浏览量(PV):用户对页面请求访问次数总和。

内联 VS 外置

对于两个相同大小的页面,一个使用了内联,只有html需要下载,一个使用了外置,包括一个js和一个css,在用户不带缓存访问页面的时候,内联所有的js和css的效率更快,原因是外置js和css带来额外的http请求开销,1个http请求相对于3个http请求要更快一些。尽管如此,现实中还是使用外部文件会产生较快的访问速度,这是由于外部js和css有机会被浏览器缓存起来,当再次请求相同的js或css的时候,浏览器将不会发出http请求,而是使用缓存的组件,减少了总体需要下载文件的大小。

综合来讲,我们一般推荐使用外置的js和css,不过这也要根据自身web的访问场景以及PV做出最优选择。

如何划分组件?

当我们决定使用外置js和css的时候,这时怎样划分js和css并打包到外部文件中成为一个首要考虑的问题。在典型情况下,页面之间的js和css的重用既不可能100%重叠,也不可能100%无关。

 

一种极端的做法是创建一个单独的,联合了所有js的文件,再创建一个包含了所有css的文件。这只要求用户生成一个Http请求,但它增加了用户不带缓存访问的情况下的数据量,同时我们必须清楚:缓存有时会失效,这将带来更多额外的开销。而且,在任何一块独立的js或css改变后,都需要更新文件,并发布新的版本号,这将使所有客户端的旧版本缓存失效。

另一种极端的做法是为每个页面提供一组分离的外部文件,这种方式真正做到按需下载,但缺点在于每个页面都产生令响应时间变慢的HTTP请求。

对于大多数web应用来说,我们需要一种折中的方案!将页面划分为几种页面类型,然后为每种类型创建单独的js和css。以css为例,我们可以创建一个所有页面都通用的global.css,再针对不同类型的页面,创建对应的css。

Web前端性能优化教程05:网站样式和脚本的更多相关文章

  1. Web前端性能优化教程06:减少DNS查找、避免重定向

    本文是Web前端性能优化系列文章中的第六篇,主要讲述内容:减少DNS查找.避免重定向.完整教程可查看:  一.减少DNS查找 基础知识 DNS(Domain Name System): 负责将域名UR ...

  2. Web前端性能优化教程08:配置ETag

    本文是Web前端性能优化系列文章中的第五篇,主要讲述内容:配置ETag.完整教程可查看:Web前端性能优化 什么是ETag? 实体标签(EntityTag)是唯一标识了一个组件的一个特定版本的字符串, ...

  3. Web前端性能优化教程07:精简JS 移除重复脚本

    本文是Web前端性能优化系列文章中的第七篇,主要讲述内容:精简Javascript代码,以及移出重复脚本.完整教程可查看:  一.精简javascript 基础知识 精简:从javascript代码中 ...

  4. Web前端性能优化教程09:图像和Cookie优化

    本文是Web前端性能优化系列文章中的第九篇,主要讲述内容:图像和Cookie优化.完整教程可查看:  一. 图像优化 图像基础知识 gif: 适用于动画效果,例如提示的滚动条图案 jpg: 是一种使用 ...

  5. Web前端性能优化教程03:添加Expires头

    本文是Web前端性能优化系列文章中的第三篇,主要讲述添内容:加Expires头.完整教程可查看:Web前端性能优化 什么是Expires头? Expires存储的是一个用来控制缓存失效的日期.当浏览器 ...

  6. Web前端性能优化教程04:压缩组件

    本文是Web前端性能优化系列文章中的第四篇,主要讲述内容:压缩组件.完整教程可查看:Web前端性能优化 基础知识 gzip编码:gzip是GUNzip的缩写,是使用无损压缩算法的一种,最早是用于Uni ...

  7. Web前端性能优化教程01:减少Http请求

    性能黄金法则 只有10%-20%的最终用户响应时间花在接收请求的HTML文档上,剩下的80%-90%时间花在HTML文档所引用的所有组件(图片,script,css,flash等等)进行的HTTP请求 ...

  8. Web前端性能优化教程02:使用内容分发网络

    基础知识 服务器离用户越近,HTTP请求的响应时间将更短. CNAME:别名记录,当多个域名需要指向同一服务器IP,可以使用一个域名做A记录指向该服务器IP,然后让多个域名指向该A记录. ICP:In ...

  9. 大型网站技术架构(3):WEB 前端性能优化

    上次说到了性能优化策略,根据网站的分层架构,可以大致的分为 web 前端性能优化,应用服务器性能优化,存储服务器性能优化三大类 这次来说一下 web 前端性能优化,一般来说,web 前端就是应用服务器 ...

随机推荐

  1. js删除数据的几种方法

    js 删除数组几种方法 var arr=['a','b','c']; 若要删除其中的'b',有两种方法: 1.delete方法:delete arr[1] 这种方式数组长度不变,此时arr[1]变为u ...

  2. 安装ESXi5.5遇到Relocating modules and starting up the kernel的处理

    在一些Dell较旧的服务器上安装ESXi 5.x时, 会遇到卡在Relocating modules and starting up the kernel过不去的问题. 比如我装的这台CS24VSS. ...

  3. BZOJ 4717 改装

    Description [题目背景] 小Q最近喜欢上了一款游戏,名为<舰队connection>,在游戏中,小Q指挥强大的舰队南征北战,从而成为了一名dalao.在游戏中,不仅船只能力很重 ...

  4. XMLHTTPRequest/Ajax请求 和普通请求的区别

    Ajax请求头会多一个x-requested-with参数,值为XMLHttpRequest 详情:http://blog.csdn.net/zhangdaiscott/article/details ...

  5. "Timeout"在测试框架里是如何被实现的

    今天组里的小伙伴问了我一个问题:“我这里有一个底层驱动的接口,我想在测试它的时候加上超时限制,时间一过就fail掉它,执行后面的测试用例.怎么办到呢?”.我问:“它自己没有超时响应的机制么? 超时抛e ...

  6. 【Flex】正则表达式

    1.基本语法 . 匹配除换行符"\n"外的任意单个字符. * 匹配前面Flex正则表达式的零次或多次出现.eg:Alert.show("ThisBookIsGoodBoo ...

  7. Theano2.1.14-基础知识之理解为了速度和正确性的内存别名

    来自:http://deeplearning.net/software/theano/tutorial/aliasing.html Understanding Memory Aliasing for ...

  8. JavaScript中的类型转换(二)

    说明: 本篇主要讨论JavaScript中各运算符对运算数进行的类型转换的影响,本文中所提到的对象类型仅指JavaScript预定义的类型和程序员自己实现的对象,不包括宿主环境定义的特殊对象(比如浏览 ...

  9. 阅读DNA-2014年读书

  10. X240s安装Win7 以及如何启用ExpressCache

    新买了一台X240S笔记本,尝试了带的Win8正版一个月后,实在无法适应Win8,干脆退回Win7完事,以下为安装过程, 第一步:制作启动U盘 首先,下载一个iso格式的Win7安装镜像文件,利用微软 ...