Ⅰ Web前端性能优化的实用技巧汇总
今天小编要跟大家分享的文章是关于Web前端性能优化的实用技巧汇总。javascript在浏览器中运行的性能,可以认为是开发者所面临的最严重的可用性问题。这个问题因为javascript的阻塞性而变得复杂,事实上,多数浏览器使用单一进程来处理用户界面和js脚本执行,所以同一时刻只能做一件事。js执行过程耗时越久,浏览器等待响应的时间越长。
一.提高加载性能
1.IE8,FF,3.5,Safari4和Chrome都允许并行下载js文件,当script下载资源时不会阻塞其他script的下载。但是js下载仍然会阻塞其他资源的下载,如图片。尽管脚本下载不会互相影响,但页面仍然必须等待所有塌尘岩js代码下载并执行完才能继续。因兄雹此仍然存在脚本阻塞问题.推荐将所有js文件放在body标签底部以减少对整个页面的影响。
2.减少页面外链脚本文件的数量将会提高页面性能:
http请求会带来额外的开销,因此下载单个300k的文件将比下载10个30k的文件效率更高。
3.动态脚本加载技术:
无论何时启动下载,文件的下载和执行都不会阻塞页面其他进程。
functionlaodScript(url,callback){
varscript=document.createElement('script');_
_cript.type='text/javascript'__f(script.readyState){//ie
____cript.onreadystatechange=function(){_____
if(script.readyState=='loaded'||script.readyState=='complete'){_______
_cript.onreadystatechange=null;_______
callback()_____
____
__
}else{//其他浏览器___
script.onload=function(){_____
_allback()
___}_
}_
script.src=url;_
document.getElementsByTagName('head')[0].appendChild(script);
}
//使用
loadScript('./a.js',function(){_
loadScript('./b.js',function(){___
loadScript('./c.js',function(){_____
console.log('加载完成')___
})_
})
})
4.无阻塞加载类库——LABjs,使用方法如下:
//链式调用时文件逐个下载,.wait()用来指定文件下载并执行完毕后所调用的函数
$LAB.script('./a.js')_
.script('./b.js')_
.wait(function(){__
_pp.init();
})
//为了保证执行顺序,可以这么做,此时a必定在b前执行
$LAB.script('./a.js').wait()_
.script('./b.js')_
.wait(function(){___
_pp.init();
})
二.数据存取与JS性能
1.在js中,数据存储的位置会对代码整体性能产生重大影响。数据存储共有4种方式:字面量,变量,数组项,对象成员。他们有着各自的性能特点。
2.访问字面量和局部变量的速度最快,相反,访问数组和对象相对较慢
3.由于局部变量存在于作用域链的起始位置,因此访问局部变量的比访问跨域作用变量更快
4.嵌套的对象成员会明显影响性能,应尽量避免
5.属性和方法在原型链位置越深,访问他的速度越慢
6.通常我们可以把需要多次使用的对象成员,数组元素,跨域变量保存在局部变量中来改善js性能
三.DOM编程
1.访问DOM会影响浏览器性能,修改DOM则更耗费性能,因为他会导致浏览器重新计算页面的几何变化。<通常的做法是减少访问DOM的次数,把运算尽量留在JS这一端。
注团御:如过在一个对性能要求比较高的操作中更新一段HTML,推荐使用innerHTML,因为它在绝大多数浏览器中运行的都很快。但对于大多数日常操作而言,并没有太大区别,所以你更应该根据可读性,稳定性,团队习惯,代码风格来综合决定使用innerHTML还是createElement()
2.HTML集合优化
HTML集合包含了DOM节点引用的类数组对象,一直与文档保持连接,每次你需要最新的信息时,都会重复执行查询操作,哪怕只是获取集合里元素的个数。
①_优化一——集合转数组collToArr
functioncollToArr(coll){_
for(vari=0,a=[],len=coll.length;i
a._ush(coll[i]);
__
returna
}
②缓存集合length
③访问集合元素时使用局部变量(即将重复的集合访问缓存到局部变量中,用局部变量来操作)
3.遍历DOM
①使用只返回元素节点的API遍历DOM,因为这些API的执行效率比自己实现的效率更高:
td{border:1pxsolid#ccc;padding:5px;margin:auto;}
td>p{text-align:left;}
td>pspan{text-align:center;display:block;}
属性名
被替代属性
children
childNodes
childElementCount
childNodes.length
firstElementChild
firstChild
lastElementChild
lastChild
nextElementSibling
nextSibling
previousElementSibling
previousSibling
_谘≡衿_PI——querySelectorAll()
querySelectorAll()方法使用css选择器作为参数并返回一个NodeList——包含着匹配节点的类数组对象,该方法不会返回HTML集合,因此返回的节点不会对应实时文档结构,着也避免了HTML集合引起的性能问题。
let_rr=_ocument.querySelectorAll('div.warning,_iv.notice>_')
4.重绘和重排
浏览器在下载完页面的所有组件——html,js,css,图片等之后,会解析并生成两个内部数据结构——_OM树,渲染树.一旦DOM树和渲染树构建完成,浏览器就开始绘制页面元素(paint).
①重排发生的条件:
添加或删除可见的DOM元素位置变化元素尺寸改变内容改变页面渲染器初始化浏览器窗口尺寸变化出现滚动条时会触发整个页面的重排_嘏疟囟ㄖ鼗
5.渲染树变化的排列和刷新
大多数浏览器通过队列化修改并批量执行来优化重排过程,然而获取布局信息的操作会导致队列强制刷新。
offsetTop,offsetWidth...
scrollTop,scrollHeight...
clientTop,clientHeight...
getComputedStyle()
一些优化建议:将设置样式的操作和获取样式的操作分开:
//设置样式
body.style.color='red'
body.style.fontSize=པpx'
//读取样式
letcolor=body.style.color
let_ontSize=_ody.style.fontSize
另外,获取计算属性的兼容写法:
functiongetComputedStyle(el){_
varcomputed=(document.body.currentStyle?el.currentStyle:document.defaultView.getComputedStyle(el,'');_
returncomputed
}
6.最小化重绘和重排
①.批量改变样式
/*使用cssText
*/el.style.cssText='border-left:1px;_order-right:2px;_adding:20px'
②.批量修改dom的优化方案——使元素脱离文档流-对其应用多重改变-把元素带回文档
functionappendDataToEl(option){
vartargetEl=option.target||document.body,___
createEl,___
data=option.data||[];_//让容器脱离文档流,减少重绘重排_
vartargetEl_display=targetEl.style.display;_
targetEl.style.display='none'
_
//*****创建文档片段来优化Dom操作****_
varfragment=document.createDocumentFragment();_//给元素填充数据_
for(vari=0,max=data.length;i
createEl=
document.createElement(option.createEl);___
for(varitemindata[i]){_____
if(item.toString()==='text'){_______
createEl.appendChild(document.createTextNode(data[i][item]));________ontinue;___________
_f(item.toString()==='html'){_______
createEl.innerHTML=item,data[i][item];_______
continue;_____
}_____
_reateEl.setAttribute(item,data[i][item]);_______
//****将填充好的node插入文档片段****___
fragment.appendChild(createEl);___
//****将文档片段统一插入目标容器****_
targetEl.appendChild(fragment);_
//显示容器,完成数据填充_
targetEl.style.display=
targetEl_display;
}
//使用
varwrap=document.querySelectorAll('.wrap')[0];
vardata=[_
_name:'xujaing',text:'选景',title:'xuanfij'},_
{name:'xujaing',text:'选景',title:'xuanfij'},_
{name:'xujaing',text:'选景',title:'xuanfij'}];
appendDataToEl({_
target:wrap,_
createEl:'div',
_ata:data
});
上面的优化方法使用了文档片段:_蔽颐前盐牡灯尾迦氲浇诘阒惺保导噬媳惶砑拥闹皇歉闷蔚淖咏诘悖皇瞧伪旧怼?梢允沟_om操作更有效率。
②.缓存布局信息
//缓存布局信息
letcurrent=el.offsetLeft;
current++;
el.style.left=current+'px'
if(current>300){_
stop();
}
④.慎用:hover
如果有大量元素使用:hover,那么会降低相应速度,CPU升高
⑤.使用事件委托(通过事件冒泡实现)来减少事件处理器的数量,减少内存和处理时间
functiondelegation(e,selector,callback){_
e=e||window.event;_
vartarget=e.target||e.srcElement;
_if(target.nodeName!==selector||
target.className!==selector||target.id!==selector){___
return;
_}_
if(typeofe.preventDefault==='function'){__
_.preventDefault();___
e.stopPropagation();
}else{___
e.returnValue=false;
e.cancelBubble=true;_
}
__allback()}
四.算法和流程控制
1.循环中减少属性查找并反转(可以提升50%-60%的性能)
//for循环
for(vari=item.length;i--){_
process(item[i]);
}
//while循环
varj=item.length;
while(j--){_
process(item[i]);
}
2.使用Duff装置来优化循环(该方法在后面的文章中会详细介绍)
3.基于函数的迭代(比基于循环的迭代慢)
items.forEach(function(value,index,array){__rocess(value);})
4.通常情况下switch总比if-else快,但是不是最佳方案
五.字符串和正则表达式
1.除了IE外,其他浏览器会尝试为表达式左侧的字符串分配更多的内存,然后简单的将第二个字符串拷贝到他的末尾,如果在一个循环中,基础字符串位于最左侧,就可以避免重复拷贝一个逐渐变大的基础字符串。2.使用[sS]来匹配任意字符串3.去除尾部空白的常用做法:
if(!String.prototype.trim){_
String.prototype.trim=function(){___
returnthis.replace(/^s+/,'').replace(/ss*$/,'')_
}
}
六.快速响应的用户界面
1.浏览器的UI线程:用于执行javascript和更新用户界面的进程。
2.在windows系统中定时器分辨率为15毫秒,因此设置小于15毫秒将会使IE锁定,延时的最小值建议为25ms.
3.用延时数组分割耗时任务:
functionmultistep(steps,args,callback){_
vartasks=steps.concat();
__etTimeout(function(){___
vartask=tasks.shift();___
task.apply(null,args||[]);_//调用Apply参数必须是数组
___
if(tasks.length>0){_____
setTimeout(arguments.callee,25);
___else{_____
_allback();___
__
},25);
}
4.记录代码运行时间批处理任务:
functiontimeProcessArray(items,process,callback){_
vartodo=item.concat();__etTimeout(function(){___
varstart=+newDate();
__o{_____
_rocess(todo.shift());___
}while(todo.length>0&&(+newDate()-start<50));
____f(todo.length>0){_____
_etTimeout(arguments.callee,25);
___else{____
_allback(items);_
}_
_,25)
}
5.使用WebWorker:它引入了一个接口,能使代码运行且不占用浏览器UI线程的时间。一个Worker由如下部分组成:
①一个navigator对象,包括app
Ⅱ 梅林路由器怎么打开pi节点
梅林路由器打开pi节点的方法是,首先进入梅林路由器的Web管理界面,然后找到网络设置的选项,找到“端口转发含郑”,在“端口转发”中添加你想渣仿要开启的PI节点,完成设置后PI节点就会被正常谈梁颂开启。
Ⅲ 我的WIN7没有windows powershell怎么办
方法一:清州直接网上下载安装包进行安装[Powershell 3.0地腊拿址:http://www.microsoft.com/en-us/download/details.aspx?id=34595]
方法二:下载WebPI [http://www.microsoft.com/web/downloads/platform.aspx],轮正搭通过WebPI安装Powershell
Ⅳ 2022年最新pi节点官网打不开怎么办
pi浏览器打不开的有很多可能性。
一是有可能app本身出了问题重新安装即可,二是在维护,三是网络不能在国内使用,需要使用加速器。解决方法:用4G流量登录如果转圈10秒进不了,就关掉流量,就会出现蓝色英文,再打开流量,再去点击蓝色英文,转圈圈一会就可以了。扩和敬展资料:pi浏览器是用来检索、展示以及传递Web信息资源的应用程序。Web信息资源由统一资源标识符所标记,它是一张网页、一张图片唯裂或者任何在Web上所展示的内容。使用者可唤山慎以借助超级链接,通过浏览器浏览互相关联的信息。
Ⅳ piweb怎么合并数据
操作如下。
1、将鼠标置于数据区域任一单元格,点击PowerPivot、管理,进行创建表操作。
2、关闭PowerPivot界面,然后点正激猜击度量值、创建度量值操作。
3、创建新的度量值,使用CONCATENATEX函数进行连接数铅友据。
4、进行创建数据透视表操作举型,勾选将此数据添加到数据模型。
5、在数据透视表中进行行和列禁用操作。
Ⅵ VS2010在微软官方网站哪里可以下载找不到啊。。
http://www.microsoft.com/express/Downloads/
点了以后语言选英文,就会弹顷察出下谈乎伏载含携 安装要联网
Ⅶ 国外传统实时数据库有哪些
a. OSI公司的PI( Plant Information System )
b. Aspen公司的IP21( InfoPlus.21 )
c. Honeywell公司的PHD( Process History Database )
d. Instep公司的eDNA(enterprise Distributed Network Architecture)
PI在国内广泛应用于电力行业,它采用了旋转门压缩专利技术和独到的二次过滤技术,使进入到PI数据库的数据经过了最有效的压缩,极大地节省了硬盘空间;IP21和PI一样属于正宗的实时数据库软件,价格和PI差不多,比较昂贵,IP21在中石油、中石化内部得到了广泛使用;由于Honeywell占据了化工行业DCS大部分份额,因此PHD在化工行业使用得也比较广泛,PHD在内部使用了Oracle关系数据库;
以上三种实时数据库均为二十世纪末推出来的传统实时数据库,由于在电力行业占垄断地位的PI价格居高不下,Instep eDNA凭借价格优势进入了电力行业,逐渐拥有了一定的客户,因此目前大型电力企业仍然偏爱OSI PI,不少中小电力企业则选择了eDNA。
特点:价格高、实时数据库包含实时数据库及其它配套软件。
Ⅷ pi是不是web3.0公链
是的,目前,所有国家和互联网公司都在探索Web3.0。Web 3.0的技术功能 (1) 智能和个性化搜索引擎。(2) 免费集成和有效的数据汇总。(3)适合多种终端平台,实现信息服务的普遍性。(4)完全民主化和分散化。任何人都可以获得财富和公平竞争,而不会被垄断。对于网络3.0时代来说,这是一种技术创新,是一种必然的趋势。不可阻挡。在未来的pi,Web3.0技术将通过公共链操作系统植入智能手机。使手机的操作系统分散,并可以在 pi 公共链网络敬岩上下载各种应用程序。这就像我们使用的苹果系统和安卓系统,宏碁系统。因此,pi不是一个采矿项目,也不是虚拟货币。它是一个绿色区块链公共链网络操作系统,是Web3.0技术的基本架构。
要实现 Web3.0 部署,我们需要一些要求。1. 有一个奖励制度,允许奖励通过一定的协商机制分发给用户。这个皮号被识别出来,我们每天只点亮闪电。2. 使用自己的浏览器,完成此 pi 数字。浏览器是实现 Web3.0 的必要数乎条件。3. 浏览器有自己的网络数据传输程序,我们的 pi 执行,pi: //4。有了一个分散的钱包,我们的pi数字也实现了。5. 通过公共链操作系统,我们的 pi 无疑是世界领先的公共链。Pi完亮毕御全改写了互联网规则,改写了属于所有人的普通人的命运,让新规则取代过时的规则这是一个历史过程,也是一个必然的趋势。世界不能保持不变,新事物随时都在发生。现在,你将能够理解Pi有多强大。
Ⅸ 派是web3.0公链吗
是web3.0公链。派是一个基于PiNetwork公链的web30区块链技术属于超级公链隐罩。全球有约物携卜40000种数字货币,但公链只有30条,而这30条公链分别是区块链1.0和区块链2.0,唯罩穗独Pi达到了web3.0公链的标准。
Ⅹ 如何从Microsoft web platform installer取得离线安装包
从微软的官网上只可以下载 officetooslforvisual2012rtw (<200kb). 很显然正是一个在线安装的启动。
如何取得离线安装包
1:必须在某个有internet的pc上安装webPI (web platform installer) 最新版本是 4.6
2:进入webPI的文件夹 C:\Program Files\Microsoft\Web Platform Installer
3:运行webPI 命令行 webPICMD
WebpiCmd.exe /offline /procts:OfficeToolsForVS2012RTW /Path:C:\YourFolder\OfficeToolsForVS2012RTW
4: 拷贝整个文件夹去A, 运行
C:\YourFolder\OfficeToolsForVS2012RTW\installers\WebpiCmd.exe /install /procts:OfficeToolsForVS2012RTW
5:利用这个办法可以拿到其他的离线安装包
完整的清单在 http://www.microsoft.com/web/webpi/4.6/webproctlist.xml