Ⅰ 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