前端性能優(yōu)化小結(jié)(持續(xù)更新中)

1. js代碼優(yōu)化

(1)減少dom操作
for循環(huán):

for(var i=0;i<array.length;i++){
    //do something
}

這種寫法的問題在于每次循環(huán)都要訪問數(shù)據(jù)的長度,會使代碼變慢,可優(yōu)化如下:

for(var i=0,max=array.length;i<max;i++){
    //do something
}

這種寫法的優(yōu)點在于將數(shù)組長度緩存起來,對長度的值只提取一次。
(2)避免使用eval
每次 eval 作用于字符串表示的源代碼時,腳本引擎都需要將源代碼轉(zhuǎn)換成可執(zhí)行代碼。這是很消耗資源的操作 —— 通常比簡單的函數(shù)調(diào)用慢 100倍以上。 同時避免DOM的xss攻擊:前端安全

2. CSS sprites

合并 CSS圖片,減少請求數(shù)的又一個好辦法。

3. 減少http請求,合理設(shè)置HTTP緩存

http協(xié)議是無狀態(tài)的應(yīng)用層協(xié)議,意味著每次http請求都需要建立通信鏈路、進行數(shù)據(jù)傳輸,而在服務(wù)器端,每個http都需要啟動獨立的線程去處理。這些通信和服務(wù)的開銷都很昂貴,減少http請求的數(shù)目可有效提高訪問性能。
減少http的主要手段是合并CSS、合并JavaScript、合并圖片、設(shè)置緩存。

4. 使用瀏覽器緩存

對一個網(wǎng)站而言,CSS、javascript、logo、圖標(biāo)這些靜態(tài)資源文件更新的頻率都比較低,而這些文件又幾乎是每次http請求都需要的,如果將這些文件緩存在瀏覽器中,可以極好的改善性能。通過設(shè)置http頭中的cache-control和expires的屬性,可設(shè)定瀏覽器緩存,緩存時間可以是數(shù)天,甚至是幾個月。

在某些時候,靜態(tài)資源文件變化需要及時應(yīng)用到客戶端瀏覽器,這種情況,可通過改變文件名實現(xiàn),即更新javascript文件并不是更新javascript文件內(nèi)容,而是生成一個新的js文件并更新HTML文件中的引用。

使用瀏覽器緩存策略的網(wǎng)站在更新靜態(tài)資源時,應(yīng)采用逐量更新的方法,比如需要更新10個圖標(biāo)文件,不宜把10個文件一次全部更新,而是應(yīng)該一個文件一個文件逐步更新,并有一定的間隔時間,以免用戶瀏覽器忽然大量緩存失效,集中更新緩存,造成服務(wù)器負(fù)載驟增、網(wǎng)絡(luò)堵塞的情況。

5. 啟用壓縮

在服務(wù)器端對文件進行壓縮,在瀏覽器端對文件解壓縮,可有效減少通信傳輸?shù)臄?shù)據(jù)量。如果可以的話,盡可能的將外部的腳本、樣式進行合并,多個合為一個。文本文件的壓縮效率可達(dá)到80%以上,因此HTML、CSS、javascript文件啟用GZip壓縮可達(dá)到較好的效果。但是壓縮對服務(wù)器和瀏覽器產(chǎn)生一定的壓力,在通信帶寬良好,而服務(wù)器資源不足的情況下要權(quán)衡考慮。

6. LazyLoad Images

這條策略實際上并不一定能減少 HTTP請求數(shù),但是卻能在某些條件下或者頁面剛加載時減少 HTTP請求數(shù)。對于圖片而言,在頁面剛加載的時候可以只加載第一屏,當(dāng)用戶繼續(xù)往后滾屏的時候才加載后續(xù)的圖片。這樣一來,假如用戶只對第一屏的內(nèi)容感興趣時,那剩余的圖片請求就都節(jié)省了。
參考文章:懶加載和預(yù)加載

7. CSS放在頁面最上部,javascript放在頁面最下面

瀏覽器會在下載完成全部CSS之后才對整個頁面進行渲染,因此最好的做法是將CSS放在頁面最上面,讓瀏覽器盡快下載CSS。如果將 CSS放在其他地方比如 BODY中,則瀏覽器有可能還未下載和解析到 CSS就已經(jīng)開始渲染頁面了,這就導(dǎo)致頁面由無 CSS狀態(tài)跳轉(zhuǎn)到 CSS狀態(tài),用戶體驗比較糟糕,所以可以考慮將CSS放在HEAD中。

Javascript則相反,瀏覽器在加載javascript后立即執(zhí)行,有可能會阻塞整個頁面,造成頁面顯示緩慢,因此javascript最好放在頁面最下面。但如果頁面解析時就需要用到j(luò)avascript,這時放到底部就不合適了。

Lazy Load Javascript(只有在需要加載的時候加載,在一般情況下并不加載信息內(nèi)容。)隨著 Javascript框架的流行,越來越多的站點也使用起了框架。不過,一個框架往往包括了很多的功能實現(xiàn),這些功能并不是每一個頁面都需要的,如果下載了不需要的腳本則算得上是一種資源浪費 -既浪費了帶寬又浪費了執(zhí)行花費的時間。目前的做法大概有兩種,一種是為那些流量特別大的頁面專門定制一個專用的 mini版框架,另一種則是 Lazy Load。

8. 減少cookie傳輸

一方面,cookie包含在每次請求和響應(yīng)中,太大的cookie會嚴(yán)重影響數(shù)據(jù)傳輸,因此哪些數(shù)據(jù)需要寫入cookie需要慎重考慮,盡量減少cookie中傳輸?shù)臄?shù)據(jù)量。另一方面,對于某些靜態(tài)資源的訪問,如CSS、script等,發(fā)送cookie沒有意義,可以考慮靜態(tài)資源使用獨立域名訪問,避免請求靜態(tài)資源時發(fā)送cookie,減少cookie傳輸次數(shù)。

9. CSS選擇符優(yōu)化

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容