① 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/