① Web前端新手要掌握的性能優化
今天小編要跟大家分享的文章是關於Web前端新手要掌握的性能優化知識。本文將分享一些前端性能優化的常用手段,包括減少請求次數、減小資源大小、各種緩存、預處理和長連接機制,以及代碼方面的性能優化等方面。下面來和小編一起看一看吧!
base64:尤其是在移動端,小圖標可以base64(webpack),大圖片慎用(如果載入速度過於慢的,而且很重要的圖片,可以用base64)
1、減少HTTP的請求次數和傳輸報文的大小
「CSSSprite(雪碧圖、圖片精靈)技術」
使用字體圖標(IconFont)或者SVG等矢量圖
+減少HTTP請求次數或者減少請求內容的大小
+渲染更快:因為它們是基於代碼渲染的,而對於點陣圖(png/jpg/gif)是需要先把圖片編碼在渲染
+不容易是幀變形
+也可以使用webp格式圖片,這種格式要小一些(但是需要伺服器端支持這種格式的請求處理)
「圖片懶載入(延遲載入)技術」
+第一次載入頁面的時候不去請求真實的圖片,提高第一次渲染頁面的速度,請求圖片的額外消耗盡可能不要處理
+當頁面載入完,把出現在用戶視野區域中的圖片做真實載入,沒有出現的先不載入(節約流浪,也能減少對伺服器的請求壓力)
o對於數據我們也盡可能分批載入(不要一次請求過多的數據,例如分頁技術)
音視頻文件取消預載入(preload='none'),這樣可以增加第一次渲染頁面的速度,當需要播放的時候在載入
客戶端和伺服器端的數據傳輸盡可能基於JSON格式完成,XML格式比JSON格式要大一些(還可以基於二進制編碼或者文件流格式,這種格式比文件傳輸好很多)
「把頁面的css/js等文件進行合並壓縮」
合並:爭取css和js都只導入一個(webpack可以實現並合並壓縮哦)
壓縮:基於webpack可以壓縮,對於圖片自己找工具先壓縮,可以使用伺服器的GZIP壓縮
圖片BASE64(用BASE64碼代表圖片,減少HTTP,增加瀏覽器渲染速度,所以真是項目中,尤其是移動端,如果圖片載入緩慢,BASE64一下就好了,;但是base64會導致文件中心的代碼超級惡心,不利於維護和開發,所以減渣瞎少使用);webpack中科院配置圖片
2、設置各種緩存、預處理和長連接機制
不經常更改的靜態資源做緩存處理(一般做的是304或者ETAG等協商緩存)
「建立Cache-Control和ExpiresHTTP的強緩存」
DNS緩存或者預處理(DNSPrefetch),減少DNS的查找
設置本地的離線存儲(manifest)或者把一些不經常更改的數據做本地臨時存儲(webstorage,indexdb)等
有錢就做CDN(地域分布式伺服器),或者加伺服器
「建立Connection:keep-aliveTcp長連接」
使用HTTP2版本協議(現在用的一般都是http1.1),可以多條tcp通道共存=>管道化鏈接
一個項目分為不同的域(不同的伺服器),例如:資源web伺服器、數據伺服器,圖片伺服器,視頻伺服器等,合理利用伺服器資源,但是導致過多的DNS解析
Cache-Control的優先順序高於Expires
基於本地存儲,做數據的存儲
3、代碼方面的性能優化
減少對閉包的使用(因為過多使用閉包會產生很多如蘆空不銷毀的內存,處理不好的話,會導致內存溢出「棧溢出」),減少閉包的嵌套(減少作用域鏈的查找層級)
對於動畫來說:能用css解決的不用js(能夠用transform處理的,不用傳統的css樣式,因為transform開啟硬體加速,不會引發迴流,或者使用定位的元素也會好很多,因為定位的元素脫離文檔流,不會對其他元素的位置造成影響),能用
requestAnimationFrame解決的不用定時器
+用requestAnimationFrame還有一個好處,當頁面處於休眠無訪問狀態,動畫會自己暫停,知道回復訪問才開始,而定時器是不論什麼狀態,只要頁面不管,就一直處理
避免使用iframe(因為iframe會嵌入其他頁面,嘩漏這樣父頁面渲染的時候,還要同時把子頁面也渲染了,渲染進度會變慢)
減少直接對DOM的操作(原因是減少DOM的迴流和重繪...),當代項目基本基於mvvm,mvc數據驅動視圖渲染的,對DOM的操作框架本身完成,性能要好很多
低耦合高內聚(基於封裝的方式:方法封裝,插件,組件,框架,類庫等封裝,減少頁面中的冗餘代碼,提高代碼使用率)
盡可能使用事件委託
避免出現死循環或者嵌套循環(嵌套循環會成倍增加循環的次數)
項目中盡可能使用非同步編程來模擬出多線程的效果,避免主線程阻塞(非同步操作基於Promise設計模式來管理)
JS中不要使用with
避免使用css表達式
函數的防抖和節流
減少使用eval(主要原因是防止壓縮代碼的時候,由於符號書寫不合規,導致代碼混亂)
圖片地圖:對於多次調取使用的圖片(尤其是背景圖),盡可能把它提取成為公共的樣式,而不是每一次重新設置background
減少filter濾鏡的使用
盡可能減少選擇器的層級
盡可能減少table布局
手動回收堆棧內存(賦值為null)
「棧溢出:死遞」
functionfunc(){
func();
}func();
解決方案:
functionfunc(){
setTimeout(func,0);
}func();
相互引用:引用類型之間的相互調用,形成嵌套式內存
letobj1={
name:'obj1',};
letobj2={
name:'obj2',
x:obj1}
obj1.x=obj2;
以上就是小編今天為大家分享的關於Web前端新手要掌握的性能優化知識的文章,希望本篇文章能夠對正在從事web前端工作的小夥伴們有所幫助,想要了解更多web前端知識記得關注北大青鳥web培訓官網,最後祝願小夥伴們工作順利,成為一名優秀的web前端工程師。
② 如何進行網站性能優化
一、前端優化
網站性能優化是一個很綜合的話題,涉及到伺服器的配置和網站前後端程序等各個方面,我只是從實際經歷出發,分享一下自己所嘗試過的網站性能優化方法。之所以在標題上掛一個web2.0,是因為本文更偏重於中小網站的性能優化,我所使用的系統也是典型web2.0的LAMP架構。
首先講講前端的優化,用戶訪問網頁的等待時間,有80%是發生在瀏覽器前端,特別是頁面和頁面中各種元素(圖片、CSS、Javascript、 flash…)的下載之上。因此在很多情況下,相對於把大量的時間花在艱苦而繁雜的程序改進上,前端的優化往往能起到事半功倍的作用。雅虎最近將內部使用的性能測試工具yslow向第三方公開,並發布了著名的網站性能優化的十三條規則,建議你下載並安裝yslow,並作為測評網站優化效果的工具。下面我挑其中特別有價值的具體說明一下優化的方法:
對於第一次訪問您網站,尚未在瀏覽器cache中緩存您網站內容的用戶,我們可以做的事情包括:
1)減少一個頁面訪問所產生的http連接次數
對於第一次訪問你網站的用戶,頁面所產生的http連接次數是影響性能的一個關鍵瓶頸。
對策:
- 盡量簡潔的頁面設計,最大程度減少圖片的使用,通過放棄一些不必要的頁面特效來減少javascript的使用。
- 使用一些優化技巧,比如利用圖片的背景位移減少圖片的個數;image map技術;使用Inline images將css圖片捆綁到網頁中。
- 盡量合並js和css文件,減少獨立文件個數。
2) 使用gzip壓縮網頁內容
使用gzip來壓縮網頁中的靜態內容,能夠顯著減少用戶訪問網頁時的等待時間(據說可達到60%)。主流的web伺服器都支持或提供gzip壓縮,如果使用apache伺服器,只需要在配置文件中開啟 mod_gzip(apache1.x)或mod_deflate(apache2.x)即可。凡是靜態的頁面,使用gzip壓縮都能夠顯著提高伺服器效率並減少帶寬支出,注意圖片內容本身已經是壓縮格式了,務必不要再進行壓縮。
3)將CSS放在頁面頂端,JS文件放在頁面底端
CSS的引用要放在html的頭部header中,JS文件引用盡量放在頁面底端標簽的後面,主要的思路是讓核心的頁面內容盡早顯示出來。不過要注意,一些大量使用js的頁面,可能有一些js文件放在底端會引起一些難以預料的問題,根據實際情況適當運用即可。
4)使JS文件內容最小化
具體來說就是使用一些javascript壓縮工具對js腳本進行壓縮,去除其中的空白字元、注釋,最小化變數名等。在使用gzip壓縮的基礎上,對js內容的壓縮能夠將性能再提高5%。
5)盡量減少外部腳本的使用,減少DNS查詢時間
不要在網頁中引用太多的外部腳本,首先,一次dns的解析過程會消耗20-120毫秒的時間;其次,如果在頁面中引用太多的外部文件(如各種廣告、聯盟等代碼),可能會因為外部文件的響應速度而將你的網站拖得很慢。如果不得不用,那麼就盡量將這些腳本放在頁腳吧。不過有一點需要提及,就是瀏覽器一般只能並行處理同一域名下的兩個請求,而對於不同子的域名則不受此限制,因此適當將本站靜態內容(css,js)放在其他的子域名下(如 static.xxx.com)會有利於提高瀏覽器並行下載網頁內容的能力。
對於您網站的經常性訪問用戶,主要的優化思路就是最大限度利用用戶瀏覽器的cache來減少伺服器的開銷。
1)在header中添加過期時間(Expires Header)
在header中給靜態內容添加一個較長的過期時間,這樣可以使用戶今後訪問只讀取緩存中的文件,而不會與伺服器產生任何的交互。不過這樣做也存在一些問題,當圖片、CSS和js文件更新時,用戶如果不刷新瀏覽器,就無法獲得此更新。這樣,我們在對圖片、css和js文件修改時,必須要進行重命名,才能保證用戶訪問到最新的內容。這可能會給開發造成不小的麻煩,因為這些文件可能被站點中的許多文件所引用。flickr提出的解決辦法是通過url rewrite使不同版本號的URL事實上指向同一個文件,這是一個聰明的辦法,因為url級別的操作效率是很高的,可以給開發過程提供不少便利。
要理解為什麼這樣做,必須要了解瀏覽器訪問url時的工作機制:
a. 第一次訪問url時,用戶從伺服器段獲取頁面內容,並把相關的文件(images,css,js…)放在高速緩存中,也會把文件頭中的expired time,last modified, ETags等相關信息也一同保留下來。
b. 用戶重復訪問url時,瀏覽器首先看高速緩存中是否有本站同名的文件,如果有,則檢查文件的過期時間;如果尚未過期,則直接從緩存中讀取文件,不再訪問伺服器。
c. 如果緩存中文件的過期時間不存在或已超出,則瀏覽器會訪問伺服器獲取文件的頭信息,檢查last modifed和ETags等信息,如果發現本地緩存中的文件在上次訪問後沒被修改,則使用本地緩存中的文件;如果修改過,則從伺服器上獲取最新版本。
我的經驗,如果可能,盡量遵循此原則給靜態文件添加過期時間,這樣可以大幅度減少用戶對伺服器資源的重復訪問。
2)將css和js文件放在獨立外部文件中引用
將css和js文件放在獨立文件中,這樣它們會被單獨緩存起來,在訪問其他頁面時可以從瀏覽器的高速緩存中直接讀取。一些網站的首頁可能是例外的,這些首頁的自身瀏覽可能並不大,但卻是用戶訪問網站的第一印象以及導向到其他頁面的起點,也可能這些頁面本身使用了大量的ajax局部刷新及技術,這時可以將 css和js文件直接寫在頁面中。
3)去掉重復的腳本
在IE中,包含重復的js腳本會導致瀏覽器的緩存不被使用,仔細檢查一下你的程序,去掉重復引用的腳本應該不是一件很難的事情。
4)避免重定向的發生
除了在header中人為的重定向之外,網頁重定向常在不經意間發生,被重定向的內容將不會使用瀏覽器的緩存。比如用戶在訪問,伺服器會通過301轉向到/,在後面加了一個「/」。如果伺服器的配置不好,這也會給伺服器帶來額外的負擔。通過配置apache的 alias或使用mod_rewrite模塊等方法,可以避免不必要的重定向。
還有一些,比如使用CDN分發機制、避免CSS表達式等、避免使用ETags等,因為不太常用,這里就不再贅述了。
做完了上述的優化,可以試著用yslow測試一下網頁的性能評分,一般都可以達到70分以上了。
當然,除了瀏覽器前端和靜態內容的優化之外,還有針對程序腳本、伺服器、資料庫、負載的優化,這些更深層次的優化方法對技術有更高的要求。本文的後半部分將重點探討後端的優化。
二、後端優化
上次寫完web2.0網站前端優化篇之後,一直想寫寫後端優化的方法,今天終於有時間將思路整理了出來。
前端優化可以避免我們造成無謂的伺服器和帶寬資源浪費,但隨著網站訪問量的增加,僅靠前端優化已經不能解決所有問題了,後端軟體處理並行請求的能力、程序運 行的效率、硬體性能以及系統的可擴展性,將成為影響網站性能和穩定的關鍵瓶頸所在。優化系統和程序的性能可以從以下的方面來入手:
1)apache、mysql等軟體的配置的優化
盡管apache和mysql等軟體在安裝後使用的默認設置足以使你的網站運行起來,但是通過調整mysql和apache的一些系統參數,還是可以追求更高的效率和穩定性。這個領域中有很多專業的文章和論壇(比如: ),要想掌握也需要進行深入的研究和實踐,這里就不重點討論了。
2)應用程序環境加速
這里僅以我最常應用的php開發環境為例,有一些工具軟體可以通過優化PHP運行環境來達到提速的目的,其基本原理大致是將PHP代碼預編譯並緩存起來,而不需要改變任何代碼,所以比較簡單,可以將php的運行效率提升50%以上。比較常用的php加速工具有:APC( http: //pecl.php.net/package-info.php?package=APC)、Turck MMCache( )、php accelebrator(),還有收費的Zend Performance Suite
3)將靜態內容和動態內容分開處理
apache是一個功能完善但比較龐大的web server,它的資源佔用基本上和同時運行的進程數呈正比,對伺服器內存的消耗比較大,處理並行任務的效率也一般。在一些情況下,我們可以用比較輕量級的web server來host靜態的圖片、樣式表和javascript文件,這樣可以大大提升靜態文件的處理速度,還可以減少對內存佔用。我使用的web server是來自俄羅斯的nginx,其他選擇方案還包括lighttpd和thttpd等。
4)基於反向代理的前端訪問負載均衡
當一台前端伺服器不足以應付用戶訪問時,通過前端機實現web訪問的負載均衡是最快速可行的方案。通過apache的mod_proxy可以實現基於反向代理的負載均衡,這里推薦使用nginx做代理伺服器,處理速度較apache更快一些。
5)應用緩存技術提高資料庫效能,文件緩存和分布式緩存
資料庫訪問處理並發訪問的能力是很多網站應用的關鍵瓶頸,在想到使用主從結構和多farm的方式構建伺服器集群之前,首先應該確保充分使用了資料庫查詢的緩存。一些資料庫類型(如mysql的innoDB)自身內置對緩存的支持,此外,還可以利用程序方法將常用的查詢通過文件或內存緩存起來。比如通過 php中的ob_start和文件讀寫函數可以很方便的實現文件形式的緩存,而如果你擁有多台伺服器,可以通過memcache技術通過分布式共享內存來對資料庫查詢進行緩存,不僅效率高而且擴展性好,memcache技術在livejournal和Craigslist.org等知名網站應用中都得到了檢驗。
6)伺服器運行狀態的檢測,找到影響性能的瓶頸所在
系統優化沒有一勞永逸的方法,需要通過檢測伺服器的運行狀態來及時發現影響性能的瓶頸,以及可能存在的潛在問題,因為網站的性能,永遠取決於木桶中的短板。可以編寫一些腳本來檢測web服務的運行,也有一些開源的軟體也提供了很好的功能
7)良好的擴展架構是穩定和性能的基礎
一些技巧和竅門可以幫你度過眼前的難關,但要想使網站具備應付大規模訪問的能力,則需要從系統架構上進行徹底的規劃,好在很多前人無私的把他們架構
網站的經驗分享給我們,使我們可以少走甚多彎路。我最近讀到的兩篇有啟發的文章:
- 從LiveJournal後台發展看大規模網站性能優化方法
- Myspace的六次重構
最後不得不提到程序編碼和資料庫結構對性能的影響,一系列糟糕的循環語句,一個不合理的查詢語句、一張設計不佳的數據表或索引表,都足以會使應用程序運行的速度成倍的降低。培養全局思考的能力,養成良好的編程習慣,並對資料庫運行機制有所了解,是提高編程質量的基礎。
③ 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
④ 你有用過哪些前端性能優化的方法
這個是面試常問的問題了。
我來簡單說下幾個方面:
1.減少http請求:在YUI35規則中也有提到,主要是優化js、css和圖片資源三個方面,因為html是沒有辦法避免的。因此,我們可以做一下的幾項操作:
合並js文件
合並css文件
雪碧圖的使用(css sprite)
使用base64表示簡單的圖片
2.減少資源體積
壓縮css
壓縮js
壓縮圖片
3.圖片載入處理:
圖片預載入
圖片懶載入
首屏載入時進度條的顯示
就簡單說這些,特別詳細的可以網上看下。
⑤ 前端性能優化的具體方法有哪些
解決辦法一:
減少http請求次數:CSS Sprites, JS、CSS源碼壓縮、圖片大小控制合適;網頁Gzip,CDN託管,data緩存 ,圖片伺服器。
前端模板 JS+數據,減少由於HTML標簽導致的帶寬浪費,前端用變數保存AJAX請求結果,每次操作本地變數,不用請求,減少請求次數
用innerHTML代替DOM操作,減少DOM操作次數,優化javascript性能。
當需要設置的樣式很多時設置className而不是直接操作style。
少用全局變數、緩存DOM節點查找的結果。減少IO讀取操作。
避免使用CSS Expression(css表達式)又稱Dynamic properties(動態屬性)。
圖片預載入,將樣式表放在頂部,將腳本放在底部 加上時間戳。
解決辦法二:
減少HTTP請求次數
使用CDN:CDN在前端開發的作用
避免空的src和href
為文件頭指定Expires
使用gzip壓縮內容
把CSS放到頂部
把JS放到底部
避 免使用CSS表達式
將CSS和JS放到外部文件中
避免跳轉
可緩存的AJAX
使用GET來完成AJAX請求
⑥ 如何進行web前端性能優化
提起Web前端性能優化的問題,前端開發人員非常熟悉,對於一個網站而言,即使內容和功能再優秀,如果用戶需要花費很久的時間才能打開,這樣遲早會消耗用戶的耐心,並最終失去用戶。
那如何才能優化前端性能?歸納為三步
一、關鍵資源位元組數
位元組數也就是通常說的減少資源文件(js、css、image、video...)的大小。
1、壓縮衫螞
前端使用uglify混淆壓縮
後端開啟gzip
對圖片進行壓縮,使用壓縮比例更高的格式(WebP)
2、緩存
強緩存(http狀態碼:200),不用請求服務運納器直接使用本地緩存,協商緩存(http狀態碼:304),使用時先請求伺服器若被告知緩存沒過期則使用本地緩存,不用下載資源,使用localstorage對數據進行存儲。
3、針對首屏優化
對非關鍵資源延遲載入、非同步載入,減少首屏資源大小
二、關鍵資源連接數
1、合並請求
使用http2.0的多路復用合並請求配置combo,在無法使用http2.0的情況下作為一種合並資源請求的手段。
2、減少圖片請求數
使用spite圖,使用svg-symbol。
3、針對一些場景採用css、js內聯的方式。
4、使用強緩存減少了一次伺服器請求。
5、非關鍵資源延遲、非同步載入,減少了首屏資源連接數。
三、關鍵渲染路徑
1、bigpipe分塊輸出
這里主要是因為要完成一整個頁面的輸出後端需要處理很多個任務,我們可以將這些多個任務進行分塊,誰先完成誰就先輸出,最終通過JS回填的方式輸出DOM節點,這種方式主要解決了直出頁面阻塞的問題。
2、bigrender分塊渲染
常規的手段就是採用前端模板渲染頁面,針對首屏時間主要減少了首次構建DOM樹時的節點數
3、針對reflow,repaint,composit路徑處理。
4、涉及到動畫時關於layer的概旁塌沒念renderlayer、graphicslayer。
5、css放在頭部、js放底部避免阻塞DOM樹的構建,關於css、js的位置對於頁面渲染的影響大家可以關注下相關的文章。核心:css資源不會阻塞DOM樹的構建但會阻塞DOM的渲染,JS會阻塞DOM樹的構建,CSS會阻塞JS的執行。
⑦ 常用的前端性能優化方法有哪些
1、減少http請求,合理設置HTTP緩存
2、使用瀏覽器緩存
3、啟用壓縮
4、CSS Sprites,合並 CSS圖片,減少請求數
5、CSS放在頁面最上部,javascript放在頁面最下面
⑧ 如何做好網站前端優化
一. 清理 HTML 文檔
二. 優化 CSS 性能
三.減少外部HTTP請求
四. 壓縮 CSS, JS 和 HTML
五. 使用預先獲取
六. 使用 CDN 和緩存提高速度
七. 壓縮文件
八. 優化你的圖片
九. 使用輕量級框架
十.前端優化 – 總結
進行前端優化似乎需要花費很大的精力,相信這篇應用指南中的一些小技巧能幫你極大改善網站載入速度。網站載入地越快,則用戶體驗越佳。因此, 對前端進行優化能使給你和你的用戶都帶來益處。如果你有任何其他好的優化方法,請在評論區留下您的寶貴建議。
⑨ 如何對前端性能進行優化
前端開發代碼優化、可維護性、瀏覽器兼容性是非常重要的課題。從實際的工程應用角度出發,最常遇見的前端優化問題。前端性能進行優化規則,基本可以涵蓋現在前端大部分的性能優化原則了,很多更加geek和精細優化方法都是從這些原則裡面延伸出來的。
前端性能進行優化都有哪些規則
減少HTTP請求次數
盡量合並圖片、CSS、JS。比如載入一個頁面有5個css文件的話,把這個5個文件合成一個的話,就只需要發出一次http請求,節省網路請求時間,加快頁面的載入。
2. 使用CDN
網站上靜態資源即css、js全都使用cdn分發,包括圖片
3. 避免空的src和href
當link標簽的href屬性為空、script標簽的src屬性為空的時候,瀏覽器渲染的時候會把當前頁面的URL作為它們的屬性值,從而把頁面的內容載入進來作為它們的值。所以要避免犯這樣的疏忽。
4. 為文件頭指定Expires
Exipres是用來設置文件的過期時間的,一般對css、js、圖片資源有效。 他可以使內容具有緩存性,這樣下回再訪問同樣的資源時就通過瀏覽器緩存區讀取,不需要再發出http請求。如下例子:
新浪微博的這個css文件的Expires時間是2016-5-04 09:14:14.
5. 使用gzip壓縮內容
gzip能夠壓縮任何一個文本類型的響應,包括html,xml,json。大大縮小請求返回的數據量。
6. 把CSS放到頂部
網頁上的資源載入時從上網下順序載入的,所以css放在頁面的頂部能夠優先渲染頁面,讓用戶感覺頁面載入很快。
7. 把JS放到底部
載入js時會對後續的資源造成阻塞,必須得等js載入完才去載入後續的文件 ,所以就把js放在頁面底部最後載入。
8. 避免使用CSS表達式
舉個css表達式的例子
font-color: expression( (new Date()).getHours()%3 ? 「#FFFFFF" : 「#AAAAAA" );
這個表達式會持續的在頁面上計算樣式,影響頁面的性能。並且css表達式只被IE支持。
9. 將CSS和JS放到外部文件中
目的是緩存文件,可以參考原則4。 但有時候為了減少請求,也會直接寫到頁面里,需根據PV和IP的比例權衡。
10. 權衡DNS查找次數
減少主機名可以節省響應時間。但同時,需要注意,減少主機會減少頁面中並行下載的數量。
IE瀏覽器在同一時刻只能從同一域名下載兩個文件。當在一個頁面顯示多張圖片時,IE 用戶的圖片下載速度就會受到影響。所以新浪會搞N個二級域名來放圖片。
下面是新浪微博的圖片域名,我們可以看到他有多個域名,這樣可以保證這些不同域名能夠同時去下載圖片,而不用排隊。不過如果當使用的域名過多時,響應時間就會慢,因為不用響應域名時間不一致。
11. 精簡CSS和JS
這里就涉及到css和js的壓縮了。比如下面的新浪的一個css文件,把空格回車全部去掉,減少文件的大小。現在的壓縮工具有很多,基本主流的前端構建工具都能進行css和js文件的壓縮,如grunt,glup等。
12. 避免跳轉
有種現象會比較坑爹,看起來沒什麼差別,其實多次了一次頁面跳轉。比如當URL本該有斜杠(/)卻被忽略掉時。例如,當我們要訪問http:// .com時,實際上返回的是一個包含301代碼的跳轉,它指向的是http:// .com/(注意末尾的斜杠)。在nginx伺服器可以使用rewrite;Apache伺服器中可以使用Alias 或者 mod_rewrite或者the DirectorySlash來避免。
另一種是不用域名之間的跳轉, 比如訪問http:// .com/bbs跳轉到http:// bbs..com/。那麼可以通過使用Alias或者mod_rewirte建立CNAME(保存一個域名和另外一個域名之間關系的DNS記錄)來替代。
13. 刪除重復的JS和CSS
重復調用腳本,除了增加額外的HTTP請求外,多次運算也會浪費時間。在IE和Firefox中不管腳本是否可緩存,它們都存在重復運算JavaScript的問題。
14. 配置ETags
它用來判斷瀏覽器緩存里的元素是否和原來伺服器上的一致。比last-modified date更具有彈性,例如某個文件在1秒內修改了10次,Etag可以綜合Inode(文件的索引節點(inode)數),MTime(修改時間)和Size來精準的進行判斷,避開UNIX記錄MTime只能精確到秒的問題。 伺服器集群使用,可取後兩個參數。使用ETags減少Web應用帶寬和負載
15. 可緩存的AJAX
非同步請求同樣的造成用戶等待,所以使用ajax請求時,要主動告訴瀏覽器如果該請求有緩存就去請求緩存內容。如下代碼片段, cache:true就是顯式的要求如果當前請求有緩存的話,直接使用緩存
$.ajax({ url : 'url', dataType : "json", cache: true, success : function(son, status){ }
16. 使用GET來完成AJAX請求
當使用XMLHttpRequest時,瀏覽器中的POST方法是一個「兩步走」的過程:首先發送文件頭,然後才發送數據。因此使用GET獲取數據時更加有意義。
17. 減少DOM元素數量
這是一門大學問,這里可以引申出一堆優化的細節。想要具體研究的可以看後面推薦書籍。總之大原則減少DOM數量,就會減少瀏覽器的解析負擔。
18. 避免404
比如外鏈的css、js文件出現問題返回404時,會破壞瀏覽器的並行載入。
19. 減少Cookie的大小
Cookie裡面別塞那麼多東西,因為每個請求都得帶著他跑。
20. 使用無cookie的域
比如CSS、js、圖片等,客戶端請求靜態文件的時候,減少了 Cookie 的反復傳輸對主域名的影響。
21. 不要使用濾鏡
IE獨有屬性AlphaImageLoader用於修正7.0以下版本中顯示PNG圖片的半透明效果。這個濾鏡的問題在於瀏覽器載入圖片時它會終止內容的呈現並且凍結瀏覽器。在每一個元素(不僅僅是圖片)它都會運算一次,增加了內存開支,因此它的問題是多方面的。
完全避免使用AlphaImageLoader的最好方法就是使用PNG8格式來代替,這種格式能在IE中很好地工作。如果你確實需要使用AlphaImageLoader,請使用下劃線_filter又使之對IE7以上版本的用戶無效。
22. 不要在HTML中縮放圖片
比如你需要的圖片尺寸是50* 50
那就不用用一張500*500的大尺寸圖片,影響載入
23. 縮小favicon.ico並緩存
⑩ 前端開發,頁面優化,性能優化有哪些方面
感覺前端的性能確實是很重要的,我談談我在實際項目中的應用。前端的應用主要從以下幾個方面進行優化:
1.減少http請求
HTTP協議是無狀態的應用層協議,意味著每次HTTP請求都需要建立通信鏈路、進行數據傳輸,而在伺服器端,每個HTTP都需要啟動獨立的線程去處理。這些通信和服務的開銷都很昂貴,減少HTTP請求的數目可有效提高訪問性能。減少HTTP的主要手段是合並CSS、合並JavaScript、合並圖片。將瀏覽器一次訪問需要的JavaScript、CSS合並成一個文件,這樣瀏覽器就只需要一次請求。圖片也可以合並,多張圖片合並成一張,如果每張圖片都有不同的超鏈接,可通過CSS偏移響應滑鼠點擊操作,構造不同的URL。
2.使用瀏覽器緩存
對一個網站而言,CSS、JavaScript、Logo、圖標這些靜態資源文件更新的頻率都比較低,而這些文件又幾乎是每次HTTP請求都需要的,如果將這些文件緩存在瀏覽器中,可以極好地改善性能。通過設置HTTP頭中Cache-Control和Expires的屬性,可設定瀏覽器緩存,緩存時間可以是數天,甚至是幾個月。在某些時候,靜態資源文件變化需要及時應用到客戶端瀏覽器,這種情況,可通過改變文件名實現,即更新JavaScript文件並不是更新JavaScript文件內容,而是生成一個新的JS文件並更新HTML文件中的引用。使用瀏覽器緩存策略的網站在更新靜態資源時,應採用批量更新的方法,比如需要更新10個圖標文件,不宜把10個文件一次全部更新,而是應一個文件一個文件逐步更新,並有一定的間隔時間,以免用戶瀏覽器突然大量緩存失效,集中更新緩存,造成伺服器負載驟增、網路堵塞的情況。
3.啟用壓縮
在伺服器端對文件進行壓縮,在瀏覽器端對文件解壓縮,可有效減少通信傳輸的數據量。文本文件的壓縮效率可達80%以上,因此HTML、CSS、JavaScript文件啟用GZip壓縮可達到較好的效果宴襪。但是壓縮對伺服器和瀏覽器產生一定的壓力,在通信帶寬良好,而伺服器資源不足的情況下要權衡考慮。
4.CSS放在頁面最上面、JavaScript放在頁面最下面
瀏覽器會在下載完全部CSS之後才對整個頁面進行渲染,因此最好的做法是將CSS放在頁面最上面,讓瀏覽器盡快下載CSS。JavaScript則相反,瀏覽器在載入JavaScript後立即執行,有可能會阻塞整個頁面,造成頁面顯示緩慢,因此JavaScript最好放在頁面最下面。但如果頁面解析時就需要用到JavaScript,這時放在底閉祥坦部就不合適了。
5.減少Cookie傳輸
Cookie在每次響應請求中,如果太大勢必會影響性能,所以沒必要網cookie放的就不放,針對性的選擇放入cookie的數據。
總之,優化轎桐的方法還很多,我感觸最深的是第4項,有些js文件大引用如果放到最前面對性能損耗很大。