深度探祕web前端性能優化

性能優化總論

1.性能優化的必要性

性能優化一直是我們在討論的一個話題,也是很重要的知識點,當項目功能越來越多,模塊規模一步步擴大,就會發生一系列的性能問題,比如說vue首屏加載會變得非常慢,編譯會延遲,打包也要等半天。
必須明確性能優化的重要性,任何一個項目的生命歷程都會走向性能優化這個階段

2.性能優化的誤區

我們經常會犯錯誤的一個地方是,混淆了性能優化與執行效率的概念

比如:

1.while 循環快還是 for 循環快?
2.|0 是不是比 Math.floor 性能好?

3.if else 與三元運算符哪個更快?

很多人會認爲以上三個問題就是性能優化的範疇了,會去糾結這些問題。然而實際上,這三個問題與性能優化毫無關係,不過是幾個執行效率的問題罷了,糾結也無益。

3.什麼纔是前端的性能優化

總結來說,就是這三個方面

1.頁面加載性能(加載的時間)

2.動畫與操作性能(是否流暢無卡頓)

3.內存、電量消耗(內存佔用,耗電量)

針對以上方面做性能優化

1.頁面加載性能(加載的時間)

a.減少請求數

(1) js,css,打包到html,併爲一個請求

(2) 精靈圖,多個小圖併爲一個圖片,只請求一次

(3) 小圖片用字體圖標代替,或者使用data-url

(4) js控制圖片懶加載,異步加載,頁面初始化的時候避免一次請求多張圖片

b.減少傳輸體積

(1) js庫存放在靜態cdn上,項目執行的時候,一個鏈接拿過來就行

(2) 壓縮策略,大圖壓縮(tinypng),代碼壓縮(webpack,Gzip)

(3) 優雅降級,根據用戶網絡狀況以及機型控制圖片清晰度

(4) 清晰度低的圖片,銳化處理,提高用戶體驗

c.緩存策略

(1)  圖片緩存

(2) 數據緩存,常用的就是地址選項,省市區,不用重複請求,緩存至用戶本地即可

2.動畫與操作性能

a.避免操作過多dom元素

可採用數據驅動,操作虛擬dom,通過diff算法,最後比較轉換成真實dom

b.避免去操作元素的top,left等位置的值

如果去改變元素的top與left等值,會導致dom迴流,可以採用dom重繪

dom迴流:當頁面中的html結構發生改變(增加、刪除元素、位置發生改變),瀏覽器都需要重新計算一邊新的DOM結構,重新對當前的頁面進行渲染。迴流非常消耗性能,特別是性能有限的移動端。
dom重繪:  當某個元素的部分樣式發生了改變(如背景顏色、字體顏色、位置(使用transform的情況下)發生了改變),瀏覽器重新渲染當前元素即可。迴流比重繪耗能耗時,所以在優化程序系統的時候,我們儘量要減少瀏覽器的DOM迴流操作。

平時操作元素的top值,left的值可以用transform裏的translate代替

3.內存、電量消耗

a.作用域問題 (內存相關)

(1) 避免定義無意義變量,每去var定一個值或者定一個對象都是佔內存的

(2) 禁止濫用閉包,js垃圾回收機制不會回收閉包裏的變量,它們將會常駐內存。

b.循環 (性能相關)

前端應避免大規模數據的比對與循環,可分開處理或交由後臺先處理好,否則也會導致卡頓

c.電量消耗 (主要是前端做遊戲的時候)

(1) 優化美術資源,比如合理規劃圖集,約定好模型的最大三角形面數,制定合理的粒子效果規範。這個可以說是遊戲優化中最重要的一個,因此,技術美術在遊戲開發中作用巨大。

(2) 簡化或者優化着色器(shader),如在遊戲開始前就對Shader進行編譯和加載。

(3) 使用Batching,儘量減少DrawCall

Batching : 批處理動態或靜態物體(批量處理,優化電量消耗)

DrawCall : CPU調用圖形編程接口,比如DirectX或OpenGL,來命令GPU進行渲染的操作(描繪次數越多,耗電量越大)

 

以上是本人的總結與經驗,如有不對,敬請指正。

如對你有幫助,可以轉發評論,轉發請註明作者及出處。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章