做爲一名前端工程師咱們除了寫得了編程修得了樣式以外,咱們須要注意的就是如何進行前端性能優化。css
先說下前端性能優化的目的,咱們從用戶角度和服務商角度來講。html
1.用戶方面:優化能讓頁面加載更快,對用戶的操做響應更及時,可以給用戶提供更爲友好的體驗;前端
2.服務商方面:優化可以減小頁面請求數,或者減小請求所佔帶寬,可以節省客觀的資源webpack
分析完優化目的,下面說說從什麼途徑進行優化或者說怎麼進行優化?優化的方法有哪些?web
1、頁面級別的優化ajax
1.1 減小http請求數以及減小請求資源的大小編程
理由:一個完整的HTTP請求需通過如下幾個流程:域名解析,DNS尋址 --> 發起TCP的3次握手 --> 創建TCP鏈接後發起http請求 --> 服務器響應http請求,瀏覽器獲得html代碼 --> 瀏覽器解析html代碼,並請求html代碼中的資源(如js、css、圖片等) --> 瀏覽器對頁面進行渲染呈現給用戶。整個流程除耗時成本不說若當下載資源過大時,頁面加載如何能快?因此減小http請求數有助於提升頁面加載速度。json
方法:gulp
1,.1.一、 儘可能合併和壓縮css和js文件。經過打包工具webpack和gulp後端
1.1.二、 儘可能所使用的字體圖標或者SVG圖標來代替傳統png圖.由於字體圖標或者SVG是矢量圖, 代碼編寫出來的,方大不會變形,並且渲染速度快
1.1.三、 減小DNS查找
1.1.4 、使用雪碧圖或者是說圖片精靈
把全部相對較小的資源圖片,繪製在一張大圖上,只須要將大圖下載下來,而後利用
圖片定位來說小圖展示在頁面中(background-position:百分比,數值)
1.1.五、 採用圖片的懶加載(延遲加載)
目的爲了,減小頁面第一次加載過程當中http的請求次數
具體步驟:
一、頁面開始加載時不去發送http請求,而是放置一張佔位圖
二、當頁面加載完時,而且圖片在可視區域再去請求加載圖片信息
1.1.六、 能用css作的效果,不要用js作,能用原生js作的,不要輕易去使用第三方插件。
避免引入第三方大量的庫。而本身卻只是用裏面的一個小功能
1.1.7減小對cookie的使用(最主要的就是減小本地cookie存儲內容的大小),由於客戶端操做cookie的時候,這些信息老是在客戶端和服務端傳遞。若是上設置不當,每次發送
一個請求將會攜帶cookie
1.1.八、前端與後端進行數據交互時,對於多項數據儘量基於json格式來進行傳送。相對於使用xml
來講傳輸有這個優點
目的:是數據處理方便,資源偏小
1.1.9 、在基於ajax的get請求進行數據交互的時候,根據需求可讓其產生緩存(注意:這個
緩存不是咱們常看到的304狀態碼,去瀏覽器本地取數據),這樣在下一次從相同地址獲取是數據
時,取得就是上一次緩存的數據。(注意:不多使用,通常都會清空。根據需求來作)
1.二、避免使用iframe
不只很差管控樣式,並且至關於在本頁面又嵌套其餘頁面,消耗性能會更大。由於還回去加載這個嵌套頁面的資源
2、代碼級別的優化
2.一、由於使用閉包後,閉包所在的上下文不會被釋放,因此在js中咱們要儘可能少使用閉包
2.2 、減小對DOM操做,主要是減小DOM的重繪與迴流(重排)
2.三、在js中避免嵌套循環和"死循環"(一旦遇到死循環,瀏覽器就會直接卡掉)
2.四、把css放在body上,把js放在body下面
讓其先加載css(注意:這裏關於優化沒有多大關係)
2.五、減小css表達式的使用
2.六、css選擇器解析規則所示從右往左解析的。減小元素標籤做爲對後一個選擇對象
2.七、儘可能將一個動畫元素單獨設置爲一個圖層(避免重繪或者回流的大小)
注意:圖層不要過多設置,不然不但效果沒有達到反而更差了
2.八、在js封裝過程當中,儘可能作到低耦合高內聚。減小頁面的冗餘代碼
2.九、css中設置定位後,最好使用z-index改變盒子的層級,讓盒子不在相同的平面上
2.十、css導入的時候儘可能減小@import導入式,由於@import是同步操做,只有把對應的樣式導入後,纔會繼續向下加茲安,而link是異步的操做
2.十一、使用window.requestAnimationFrame(js的幀動畫)代替傳統的定時器動畫
若是想使用每隔一段時間執行動畫,應該避免使用setInterval,儘可能使用setTimeout
代替setInterval定時器。由於setInterval定時器存在弊端:可能形成兩個動畫間隔時間
縮短
2.十二、儘可能減小使用遞歸。避免死遞歸
解決:建議使用尾遞歸
2.1三、基於script標籤下載js文件時,可使用defer或者async來異步加載
2.1四、在事件綁定中,儘量使用事件委託,減小循環給DOM元素綁定事件處理函數。
2.1五、在js封裝過程當中,儘可能作到低耦合高內聚。減小頁面的冗餘代碼
2.1六、減小Flash的使用
3、、存儲
3.一、結合後端,利用瀏覽器的緩存技術,作一些緩存(讓後端返回304,告訴瀏覽器去本地拉取數據)。(注意:也有弊端)可讓一些不太會改變的靜態資源作緩存。好比:一些圖片,js,cs
3.二、利用h5的新特性(localStorage、sessionStorage)作一些簡單數據的存儲, 避免向後臺請求數據或者說在離線狀態下作一些數據展現。