高性能网站建设进阶指南(三)

第五章  整合异步脚本

1、脚本如果按常规方式加载<scripg src=""></script不仅会阻塞页面中其它内容的下载,还会阻塞脚本后面所有元素的渲染,异步加载脚本可以避免这种阻塞情况。但是代码异步执行时可能会出现竞争状态而导致出现未定义标识符的错误。如果行内脚本依赖外部脚本(如引用jquery),保证执行顺序就很重要,外部脚本必须在行内脚本之前下载、解析、执行。

2、竞争状态

没有一种技术既能并行下载又能保持执行顺序,唯一的特例是firefox中执行的Script DOM Element

3、异步加载脚本时保持执行顺序

当外部脚本按常规加载时,它会阻塞行内代码的执行,竞争状态不会发生,如果我们开始异步加载脚本,就需要把行内代码和依赖行内代码的外部脚本整合起来,这些整合技术是:

(1)硬编码回调(HardCoded CallBack):让外部代码调用行内代码里的函数,这种方法不灵活。

(2)window Onload:通过监听window的Onload事件来触发行内代码的执行,有两个缺点:一是异步脚本是通过阻塞onload事件的方式加载的;二是可能导致行内代码延迟执行。

(3)定时器(Timer):使用轮询方法保证在行内代码执行之前所依赖的外部脚本已经加载,如setTimeOut()方法。

(4)Script Onload:是最好的选择,通过监听脚本的Onload事件而解决了所有问题。

(5)Degrading Script Tags--降级使用script标签,避免了未定义标识符的错误,如下代码:

<script src="jquery.js" type="text/javascript">
jquery(‘p‘).addClass("pretty");
</script>

但这种语法有的浏览器不支持

4、之前都说的是加载单个脚本,如果有多个脚本和行内代码要按指定的顺序执行。

第六章  布置行内脚本

行内脚本不会产生额外的http请求,但会阻塞页面上的资源并下载,还会阻塞逐步渲染。

解决方案是:

(1)把行内脚本移到最底部

(2)使用异步回调启动JS的执行----简单的异步调用技术就是使用setTimeout。

function longCode(){
var vstart=Number(new Date());
while((vstart+5000)>Number(new Date()))
{};
setTimeout(vstart,0);
}

(3)使用script的defer属性,没有setTimeout()好。

(4)保持CSS和JS的执行顺序

浏览器是按照样式表的在页面中列出的顺序应用它们的,而与下载顺序无关。

(5)把行内脚本放在样式表之后有风险:当样式表下载完成并且行内脚本执行完成时,后续资源才开始下载,大部分下载都不阻塞行内脚本。

解决方案:调整行内脚本的位置,使其不出现在样式表和任何其它资源之间。即把行内脚本放在样式表之前。

第七章  编写高效的JS

1、管理作用域

当执行JS时,JS会创建一个执行上下文,执行上下文设定了代码执行时所处的环境,JS引擎会在页面加载后创建一个全局的执行上下文,然后每执行一个函数时都会创建一个对应的执行上下文,最终建立一个执行上下文的堆栈,当前起作用的执行上下文在堆栈的最顶部。

每个执行上下文都有一个与之关联的作用域链,用于解析标识符,作用域链包含一个或多个变量对象,这些对象定义了执行上下文作用域内的标识符。全局执行上下文的作用域链中只有一个变量对象,它定义了JSk上所有可用的变量和函数。

当函数被创建时,JS引擎会把创建时执行上下文的作用域赋给函数的内部属性,当函数被执行时,JS引擎会创建一个活动对象,并在初始化时给this,arguments、命名参数和该函数的所有全局变量赋值。

活动对象会出现在执行上下文作用域链的顶端,紧接其后的是函数属性中的对象。

下面这个代码执行时执行上下文和作用域链的关系:

function Add(num1,num2){
return num1+num2;
}
var result=Add(5,10);

console.log(result);

局部变量是JS中读写最快的标识符,标识符越深查找越慢,这种现象几乎在所有的浏览器中都存在。标识符在作用域链中的位置越靠上,存取的速度就越快。

任何非局部变量在函数中使用超过了一次,则应该把它存储为局部变量,如这段代码:

function CreatForChild(elementId)
{
var elementR=document.getElementById(elementId);
newElement=document.createElement(‘div‘);
elementR.appendChild(newElement);
}

因为document的使用超过了1次,存储为局部变量:

var doc=document;

全局变量对象始终是作用域中的最后一个对象,所以对全局标识符的解析总是最慢的。

注意:给变量首次赋值时忽略var关键字,会带来性能问题,因为当对未声明的变量赋值时,JS引擎会自动将其创建成一个全局变量。

在代码执行过程中,执行上下文对应的作用域链通常保持不变,但有两个语句会临时增长执行上下文的作用域链,是with语句和try...catch语句中的catch从句,但是catch从句的影响要比with语句的影响要小,但是要注意不要在catch从句中执行过多的代码,以免对性能造成影响。

personInfo();
function personInfo(){
var person={name:‘Marry‘,age:30};
with(person){
document.write(name+" is:"+age+"岁");
}
}

WITH语句加深作用域链

管理好作用域链是一种提高性能的简易方法。

2、高效的数据存取

在脚本中有四个地方可以存取数据:

(1)字面量值

(2)变量

(3)数组元素:通过索引

(4)对象属性:通过属性值

从字面量值和局部变量中存取数据的开销差异很小,不需要担心性能问题。

各个浏览器存取数据的时间:

function process(data)
{
if(data.count>0)
{
for(var i=0;i<data.count;i++)
{
processData(data.items[i]);
}
}
}

改写成局部变量存取时间将会缩短

function process(data)
{

var count=data.count;
if(count>0)
{
for(var i=0;i<count;i++)
{
processData(data.items[i]);
}
}
}

在数据存取时,超过一次的变量属性和数据元素存储为局部变量是提升性能的一种好方法。

对于在多数浏览器来说,取变量属性用data.count或者data[count]几乎没有区别。

window.onload=function(){
var divs=document.getElementsByTagName(div);
for(var i=0;i<divs.length;i++)
{
var div=divs[i];
process(div);//输出DIV里面的内容
}
}

改写成这样存取速度更快

window.onload=function(){
var divs=document.getElementsByTagName("div");
for(var i=0;lens=divs.length;i<lens;i++)
{
var div=divs[i];
process(div);//输出DIV里面的内容
}
}

3、流控制

(1)快速条件判断

时间: 2024-08-26 00:37:09

高性能网站建设进阶指南(三)的相关文章

高性能网站建设进阶指南:Web开发者性能优化最佳实践 pdf扫描版

高性能网站建设进阶指南:Web开发者性能优化最佳实践是<高性能网站建设指南>姊妹篇.作者Steve Souders是Google Web性能布道者和Yahoo!前首席性能工程师.在本书中,Souders与8位专家分享了提升网站性能的最佳实践和实用建议,主要包括:理解Ajax性能,编写高效的JavaScript,创建快速响应的应用程序.无阻塞加载脚本, 跨域共享资源,无损压缩图片大小,使用块编码加快网页渲染:避免或取代iframe的方法,简化CSS选择符,以及其他技术.性能是任何一个网站成功的关

高性能网站建设进阶指南(一)

WEB性能提升的14条规则: 1.尽量减少HTTP请求(使用css sprites): 2.使用CDN; 3.添加Expires头: 4.添加Gzip压缩组件: 5.将样式表放在顶部: 6.避免CSS表达式,使用外部的js和css,并精简JS,删除重复的脚本: 7.减少DNS查询: 8.避免重定向: 9.配置ETag: 10.使ajax可缓存: 第一章    理解ajax性能 1.权衡:但是在97%的情况下,过早优化是万恶之源,但我们不应该错过那关键的3%.现实情况的项目三角形(项目管理的三角形

高性能网站建设进阶指南(二)

第四章  无阻塞加载脚本 阻塞:大部分浏览器在下载或执行<script>标签内容时不会下载其他内容.浏览器是按顺序执行的,但不一定要按顺序下载脚本. 对于外部脚本,如果浏览器缓存中有,就从缓存中读取,否则发送HTTP请求获取. 解决阻塞: (1)把所有的<script>中的代码内嵌在HTML页面中,这种方法不推荐使用. (2)XHR Eval.XHR注入.Script in Iframe(iframe是页面中开销最高的DoM元素),这两个的缺点:通过XHR获取的脚本必须部署在和主页

前端性能优化规则总结—读《高性能网站建设指南》

本文对<高性能网站建设指南>这本书中提出的14种基本的前端性能优化方案进行了总结,这本书介绍的优化方案比较过时了,不能完全满足目前前端性能优化,如果您浏览完能弄清楚每种方案的实施过程.就没必要看这本书了. 规则1-减少HTTP请求 1.使用图片地图 图片地图允许你在一个图片上关联多个URL,目标URL的选择取决于用户点击了图片上的哪个位置. 比如导航栏菜单有五个选项,为了美观,我们将菜单对应的超链接关联到图片上,可以使用五个分开的图片分别关联五个分开的超链接,此时加载这个导航菜单就要通过五次H

高性能网站建设指南pdf

下载地址:网盘下载 内容简介  · · · · · · 本书结合Web 2.0以来Web开发领域的最新形势和特点,介绍了网站性能问题的现状.产生的原因,以及改善或解决性能问题的原则.技术技巧和最佳实践.重点关注网页的行为特征,阐释优化Ajax.CSS.JavaScript.Flash和图片处理等要素的技术,全面涵盖浏览器端性能问题的方方面面.在<高性能网站建设指南>中,作者给出了14条具体的优化原则,每一条原则都配以范例佐证,并提供了在线支持.<高性能网站建设指南>内容丰富,主要包

高性能网站建设

压缩 浏览器使用Accept-Encoding头来生命它支持压缩. 服务器使用content-Encoding头确认响应已被压缩. 持久连接 request:      Connection:keep-alive response:    Connection:keep-alive 图片优化 1.使用图片地图,将多个图片整合到一张图片上   <map> 2.CSS Sprites   多张图片合并为一张,使用时,通过位置制定 合并后大小比单个图片总和还小,并且减少http请求 3.内联图片 d

高性能网站建设和优化

高性能网站建设和优化 在前端中,性能优化就是优化用户体验,减少响应速度以助于提高网页整体的加载速度,提高性能在建设高性能页面中不可缺少的一部分. 改进性能分为从前端改进和后台改进. 可以说前端是改进编辑页面的一些细节,在建设页面编辑代码是就注意性能的优化,然后集少成多 ,响应和加载时间通过逐步的减少,到达性能的改进, 而且在前端优化中需要的时间和资源都较少. 而要从后台入手改进性能,就相对来说复杂,也会带来很多的改动. 前端 作为前端开发人员,就要把性能优化的重点放在前端优化中.在代码编辑中考虑

《高性能网站建设指南》

1.目录11页 1.第一章:规则1-减少HTTP请求,介绍为什么额外的HTTP请求会对性能产生巨大的影响,并介绍了减少HTTP请求的方法,包括图片地图.CSS Sprites.使用data:模式的URL内嵌图片,     以及合并脚本和样式表 2.第二章:规则2-使用内容发布网络,强调了使用内容发布网络的优势 3.第三章:规则3-添加Expires头,研究了一个简单的HTTP头是如何通过浏览器缓存来戏剧性地改善web页面性能的 4.第四章:规则4-压缩组件,解释了压缩是如何工作的,以及如何为we

高性能网站建设指南

规则1——减少HTTP请求 只有10%到20%的最终用户响应时间花在接收请求的HTML文档上面.剩下80%到90%的 时间花在为HTML文档所引用的所有组件(图片,脚本,flash,样式表等)进行的HTTP请求上.因此改善响应的最简单途径就是减少组件数量,由此减少HTTP请求的数量. 图片地图 使用map标签进行坐标定位,减少图片数量.导航栏中使用了多个图片时候可以使用. 缺点很多:手工方式很难完成坐标定位,且容易出错.除了矩形之外也难以定义其他形状,通过DHTML定义的图片IE中还无法工作.不