① 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
② 怎么将Web文件打开方式设置成指定浏览器
设置打开方式
(图1-1
设置打开方式)
在相应文件的右键选择程序之后,弹出打开方式的窗口(如图1-2所示)然后选择相应的打开方式。
相应一些使用WPS和OFFICE软件的朋友会经常使用这个方式。因为安装WPS之后默认打开DOC和EXCEL表格都是WPS所以一些网友非常的不适应,就可以使用这种方式设置了。
设置默认软件打开方式
(图1-2
设置默认软件的打开方式)
以上是大家最经常用,也是最方便和实用的文件默认打开方式。
其实所有的扩展名都是在文件夹选项中的文件类型中修改的。
如图1-3所示这样,打开我的电脑后在工具栏中选择工具>文件夹选项,调出文件夹选项。
或者在控制面板中是一样可以调出文件夹选项的。开始》控制面板》文件夹选项;
修改默认打开文件方式
(图1-3
文件夹选项)
调出文件夹选项之后,选择文件夹类型选项卡,在已注册的文件类型中找到你需要修改的文档打开的扩展名。
这里比如你需要把DOC文档默认修改成WPS的话,就需要在扩展名那里找到相应的DOC文档,后面是文件类型。然后选择图1-4
中第四步标记的更改按扭。然后弹出如图1-2所示的一样。选择相应打开的程序。
更改文件默认打开方式
(图1-4
更改文件默认打开方式示意图)
以上只是系统处事宾工具。比较实用,但是一些改起来比较麻烦,而且不适合一些网友。建议在网上下载一些小工具进行修改。一般的杀毒软件都会带这些小功能。
我就经常使用360安全卫士,里面功能大全里有一个默认软件设置。可以进行一些默认软件的设置。
双击打开360安全卫士之后,找到功能大全,在功能大全里找到默认软件设置(如图1-5所示)
360安全卫士设置默认软件
(图1-5
360安全卫士的默认软件设置)
相信到了这一步,不用说明了。都很清楚了吧。360也许就这一个好处吧。纯图形界面,通俗易懂!
想设置那个浏览器在后面直接设为默认即可。而且是立即生效的。
如果设置没用的话。如果你电脑里有来意插件或者有毒。杀杀毒吧。
默认浏览器打开设置
(图1-6
默认浏览器打开设置)
③ Web设计的设计原则有哪些
好的设计能够帮助企业提升数据,同时还可以提供用户一个良好的使用体验。GoodUI 总结了一个长达69条设计原则的清单(不断增加中),列举了他们认为非常重要的设计要点。
与以往的一些文章不一样的是这里提到的69点其中有一部分 GoodUI 已经通过 AB Test 验证过可行性。当然分析报告是需要付费的,单篇39美金。
不过今天讨论的重点并不是付费报告,而是这69条设计原则。我按照自己的理解将它们翻译成了中文并配上图片,希望对大家有所帮助。
本篇文章内容及图片均来自于GoodUI,如有翻译不恰当的地方欢迎大家指正。
01 尝试使用一列的布局替代多列布局
02 给用户一些小的利益,别看上去那么赤裸裸
03 合并相似的功能
04 尝试展示来自用户的赞扬,而不是自我表扬
05 重复核心行动点
06 统一视觉规范,提升可识别性
07 尝试使用推荐的口吻,而不是让用户感觉面对一台冷冰冰的机器
08 给用户吃“后悔药”的机会
09 告诉用户产品适用的人群,而不是人人都通用
10 将文案写得更加的直接,而不是一堆废话
11 增强主行动点的视觉冲击力,提升它在页面中的可对比性
12 让用户知道你从哪儿来更易于拉近与用户的关系
13 将表单做的简单点,确保用户在抓狂之前能进入下一步
14 尽量将用户需要选择的信息展示出来而不是藏起来
15 页面的排版需要考虑用户是否会漏掉底部信息
16 如果页面的底部有需要关注的行动点,别让文中过多的外链带走了用户
17 确保用户知道自己目前的状态
18 将利益点融合在行动点中,增强用户的点击欲望
19 将行动点与当前信息结合起来
20 将简要的表单合并到页面中,减少调整页面带来的用户流失
21 适当的增加延迟动效,让用户感知到页面的变化
22 让新用户从尝试产品入手,而不是一来就面对冷冰冰的注册表单
23 减少使用线框,这会过多的吸引用户注意力,而且会让页面看上去透不过气
24 给用户推销你能给他带来的利益,而不是功能
25 一定要注意0结果页面的设计,这也是引导用户的好地方
26 给用户选择退出的权利,特别是邮件订阅
27 注意界面元素的一致性,降低用户学习成本
28 给下拉框增加一些预设值,降低用户填写成本
29 延续用户日常的使用习惯,而不是重新创造
30 尝试告诉用做些事情降低自己的损失,而不是提升收益
31 提升页面的视觉层次,增强可阅读性
32 将同类的操作合并在一起,降低用户的认知成本
33 表单及时校验,而不是统一提交后在告诉用户填错了
34 尝试将表单输入变得更加宽容,让用户的填写更加简单
35 通过时间增强紧迫感
36 提供用户可预见性的操作,降低用户的心理成本
37 尽可能的帮助用户选择,而不是让用户想破脑袋
38 尽可能将操作区域放大,降低用户操作成本
39 页面加载速度很重要,尽可能让用户感受到你的网站速度很快
40 如果可以,增加键盘快捷键,提升操作效率
41 尝试通过对比来让用户感知到性价比
42 尝试对进度条进行“设计”来降低用户等待的焦虑
43 根据用户选择逐步展示信息,降低无效信息对用户的干扰
44 有时候较小的承诺比“夸海口”会更容易让用户信服
45 尝试将提示信息弱化,减少对用户操作的干扰
46 尽量通过系统的功能来简化用户的操作
47 用文本配合图标来降低用户的认知成本
48 用更自然的语言代替冷冰冰的机器
49 放出一些摘要信息来帮助用户识别是否需要进一步了解
50 在关键的页面增加用户权益信息,增强用户进一步操作的信心
51 将价格进行换算,让用户感觉这很便宜
52 记得在成功页面感谢用户
53 将数字转化成易于用户阅读的形式,而不是冷冰冰的机器语言
54 告诉用户选择的权利和自由“诱惑力”
55 尝试让语言更具“诱惑力”
56 通过设计引导用户的注意力
57 通过友好的对比来展示产品,为用户做决定提供帮助
58 通过任务机制来提升用户的满足感
59 让用户了解接下来将要发生什么事情
60 尝试用更幽默一些的语言文案
61 任何操作之后都要给出反馈,让用户知道操作已经生效
62 注意动效的真实使用情况(Amazon 的类目菜单就是一个很好的例子)
63 注意排版的,不要让信息过于拥挤
64 尝试用讲故事的方式来传递信息,增强用户的代入感
65 尽量给用户展示真实的信息,不要欺骗
66 随着用户的不断熟悉简化界面
67 试着用用户的口吻展示信息
68 在表单中增加一些提示信息,减少错误的几率
69 最后,用简单的文案传递核心关注的信息,少一些废话
这69条设计原则虽然针对 Web 设计,但有些部分在移动产品设计中同样有效。
转载自:http://gooi.org/