網頁性能優化的一些方法
來自專欄 web前端心得1 人贊了文章
優化網頁性能,也就是多使用內存和緩存,減少CPU的計算次數,減少網路請求次數。
- 載入資源優化
- 對靜態資源進行壓縮合併
- 對靜態資源進行緩存
- 使用CDN讓資源載入更快
- css精靈
- 使用SSR(server side render)後端渲染,數據直接輸出到html中
- 渲染優化
- css放在html前面,js放後面
- 懶載入
- 緩存dom查詢 (減少dom查詢,對dom查詢做緩存)
- 合併dom操作 (減少dom操作,多個操作盡量合併在一起執行)
- 函數去抖,函數節流(防止用戶短時間內頻繁操作dom,減少CPU計算)
- 儘早執行操作(DOMContentLoaded)
window.addEventListener(load,function(){//頁面的全部資源(包括圖片和視頻)載入完成後才會執行})document.addEventListener(DOMContentLoaded,function(){//DOM渲染完即可執行,此時圖片、視頻還可能沒有載入完})
函數節流 throttle 和 去抖 debounce:
var div1=document.getElementById(div1);var timer; div1.addEventListener(keyup,function(){ if(timer){clearTimeout(timer);} timer=setTimeout(function(){ 滿足條件執行函數 },100) })----------------------------------------------------------var lastTime=null; div1.addEventListener(keyup,function(){ var nowtime=new Date(); if(nowtime-lastTime > 自定義時間間隔){ 滿足條件執行函數 lastTime=nowTime; }})
函數節流 throttle 的應用場景?哪些時候我們需要間隔一定時間觸發回調來控制函數調用頻率?(延遲多久觸發,必須超過delay安全期才觸發。類似於坐電梯的過程,只要有人按就延遲上樓,電梯等待的事件相當於delay安全期)
- 元素的拖拽功能(mousemove)
- 射擊遊戲的 mousedown/keydown 事件(單位時間只能發射一顆子彈)
- 計算滑鼠移動的距離(mousemove)
- Canvas 模擬畫板功能(mousemove)
- 搜索聯想(keyup)
- 監聽滾動事件---判斷是否到頁面底部時,自動載入更多資源:給 scroll 加了 debounce 後,只有用戶停止滾動後,才會判斷是否到了頁面底部;如果是 throttle 的話,只要頁面滾動就會間隔一段時間判斷一次
函數去抖 debounce 的應用場景?哪些時候對於連續的事件響應我們只需要執行一次回調?(多久觸發一次)
- 每次 resize/scroll 觸發統計事件
- 文本輸入的驗證(連續輸入文字後發送 AJAX 請求進行驗證,驗證一次就好)
函數節流和函數去抖的核心其實就是限制某一個方法被頻繁觸發,而一個方法之所以會被頻繁觸發,大多數情況下是因為 DOM 事件的監聽回調,而這也是函數節流以及去抖多數情況下的應用場景。
參考:JavaScript 函數節流和函數去抖應用場景辨析 · Issue #20 · hanzichi/underscore-analysis
推薦閱讀:
※【SNF-A】Angular 增加 Hammer.js 的 Lazy Loading 支持
※前端性能優化(一)用一張圖說明載入優化
※Chrome Headless 模式
※七個前端必須知道的性能優化點,你知道多少?
TAG:性能優化 | 前端性能優化 | 構建高性能web站點 |