前端性能優化一網打盡

1、負載均衡
(1)DNS服務器實現負載均衡。缺點:無法判斷哪一個server是down機的,無法判斷每個server的負載
(2)硬件設備:負載均衡器(Load Balancer),作爲獨立的硬件置於客戶端與服務器之間。價格昂貴
(3)反向代理:Nginx服務器,反向代理是實現負載均衡的主流手段之一,當我們訪問擁有反向代理的網站時,實際訪問的是其反向代理服務器,而非真正的服務器,當請求到達反向代理服務器時,反向代理服務器再將請求轉發至服務器。

2、CDN網絡
內容分發網絡(Content Delivery Network),簡稱:CDN,通常情況下,我們所要的數據都是從主服務器中獲取,但假如我們的主服務器在南方,而訪問用戶在北方,那麼訪問速度就會相對變慢,變慢的原因有很多,例如傳輸距離,運營商,帶寬等等因素,而使用CDN技術的話,我們會將CDN節點分佈在各地,當用戶發送請求到達服務器時,服務器會根據用戶的區域信息,爲用戶分配最近的CDN服務器。
CDN簡單的來說就是存儲一些靜態文件的一臺或多臺服務器,通過複製,緩存等方式,將文件保存其中。
  (1).靜態文件
   css,html,圖片,媒體都屬於靜態文件,也就是說用戶發送的請求不會影響靜態文件的內容,而jsp,php等文件就不屬於靜態文件,因爲他們的內容會因我們的請求而發生改變。
   ( 2).CDN數據從哪裏來
  複製,緩存,CDN服務器可以在用戶請求後緩存文件,也可以主動抓取主服務器內容。

3、減少HTTP請求
(1)腳本合併:通常一個大型網站需要依賴多個JS文件。可以把多個文件合併成一個,這樣只需要引用一個
(2)CSS雪碧圖 。缺點:
① 最大的問題是內存的使用:除非非常小心的組織,否則會留下大量無用的空白。
② 影響頁面縮放功能:縮放時要避免雪碧中相鄰圖片露出來。

4、文件壓縮
包括CSS、JavaScript、圖片的壓縮。
JavaScript:
最小化:刪除註釋和空格等不必要的字符。安全、直白,文件減少21%。
混淆:刪除註釋和空格,將函數名和變量名替換成短的字符串,難於反向工程。複雜,容易產生問題,文件減少25%。

5、延遲加載圖片(Lazy Load Images)
懶加載的原理:我們先將img標籤中的src鏈接設置爲一樣的圖片(空白圖片),將真正的圖片鏈接放在自定義屬性中,如(data-src),當js監聽到圖片元素進入到可視窗口的時候,將自定義屬性中的地址存儲到src中,達到懶加載的效果。

6、避免使用eval 和Function 、with
每次 eval 或 Function 構造函數作用於字符串表示的源代碼時,腳本引擎都需要將源代碼轉換成可執行代碼。這是很消耗資源的操作 —— 通常比簡單的函數調用慢 100倍以上。
  eval 函數效率特別低,由於事先無法知曉傳給 eval 的字符串中的內容,eval在其上下文中解釋要處理的代碼,也就是說編譯器無法優化上下文,因此只能有瀏覽器在運行時解釋代碼。這對性能影響很大。
  Function 構造函數比 eval略好,因爲使用此代碼不會影響周圍代碼 ;但其速度仍很慢。
  此外,使用 eval和 Function也不利於Javascript 壓縮工具執行壓縮。

7、 減少作用域鏈查找
也就是減少跨作用域查找,例如:閉包

8、減少cookie傳輸
一方面,cookie包含在每次請求和響應中,太大的cookie會嚴重影響數據傳輸,因此哪些數據需要寫入cookie需要慎重考慮,儘量減少cookie中傳輸的數據量。另一方面,對於某些靜態資源的訪問,如CSS、script等,發送cookie沒有意義,可以考慮靜態資源使用獨立域名訪問,避免請求靜態資源時發送cookie,減少cookie傳輸次數。

9、合理設置瀏覽器緩存、CDN緩存、 HTTP緩存(https://www.jianshu.com/p/47f3406c8084)
瀏覽器緩存:網頁靜態文件在初次加載是會保存在本地,作爲緩存
沒有CDN:瀏覽器緩存
使用了CDN:瀏覽器緩存+CDN緩存(屬於服務器緩存)
強制緩存:如果命中強制緩存,返回200,利用Expires或者Cache-Control這兩個http header實現的,都用來表示資源在客戶端緩存的有效期,但是Expires是服務器返回的一個絕對時間,在服務器時間與客戶端時間相差較大時,緩存管理容易出現問題,比如隨意修改下客戶端時間,就能影響緩存命中的結果。所以在http1.1的時候,提出了一個新的header,也就是Cache-Control,這是一個相對時間,在進行緩存命中的時候,都是利用客戶端時間進行判斷,因此更有效安全一些。
對比緩存:如果命中對比緩存,請求響應返回的http狀態爲304以及一個Not Modified字符串,對比緩存利用的是【Last-Modified、If-Modified-Since】、【ETag、If-None-Match】這兩對header來管理的。
Etag的出現主要是爲了解決幾個Last-Modified比較難解決的問題:
1.Last-Modified標註的最後修改只能精確到秒級,如果某些文件在1秒鐘以內,被修改多次的話,它將不能準確標註文件的新鮮度
2.如果某些文件會被定期生成,當有時內容並沒有任何變化,但Last-Modified卻改變了,導致文件沒法使用緩存
3.有可能存在服務器沒有準確獲取文件修改時間,或者與代理服務器時間不一致等情形。
Last-Modified與ETag是可以一起使用的,服務器會優先驗證ETag,一致的情況下,纔會繼續比對Last-Modified,最後才決定是否返回304。

10、CSS放在頁面最上部,javascript放在頁面最下面
減少css表達式的應用

11、異步請求 Callback
大運算量或者費時操作給瀏覽器線程去處理,這樣可以保證js主線程不被阻塞。

12、避免重定向
301:永久重定向,抓取新內容的同時也將舊的網址替換爲重定向之後的網址;
302:暫時重定向,抓取新的內容而保留舊的網址
302好於301
重定向會增加http請求數,但必要的重定向有利於提高用戶體驗
定義鏈接URL時使用最完整的、最直接的地址。如:
使用www.baidu.com而非baidu.com
使用www.google.com.hk而非www.google.com
使用http://write.blog.csdn.net/而非http://write.blog.csdn.net

13、減少DOM操作和重排和重繪
減少對DOM元素的查詢與修改
重排【reflow】
重繪【repaint】
重排會導致重繪

14、使用GET請求
爲什麼get比post更快
(1).post請求包含更多的請求頭
因爲post需要在請求的body部分包含數據,所以會多了幾個數據描述部分的首部字段(如:content-type),這其實是微乎其微的。
(2).最重要的一條,post在真正接收數據之前會先將請求頭髮送給服務器進行確認,然後才真正發送數據
(3).get會將數據緩存起來,而post不會
(4).post不能進行管道化傳輸

移動端性能優化
1.儘量使用css3動畫,開啓硬件加速。
2.適當使用 touch 事件代替 click 事件。
3.避免使用 css3 漸變陰影效果。
4.可以用 transform: translateZ(0) 來開啓硬件加速。
5.不濫用Float。Float在渲染時計算量比較大,儘量減少使用
6.不濫用Web字體。Web字體需要下載,解析,重繪當前頁面,儘量減少使用。
7.合理使用requestAnimationFrame動畫代替setTimeout
8.CSS中的屬性(CSS3 transitions、CSS3 3D transforms、Opacity、Canvas、WebGL、Video)會觸發GPU渲染,請合理使用。過渡使用會引發手機過耗電增加
9.PC端的在移動端同樣適用

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