前端性能優化,是每一個前端必備的技能,優化本身的代碼,使本身的網址能夠更加快速的訪問打開,減小用戶等待,今天就會從幾個方面提及前端性能優化的方案,javascript
看下面的一張圖,常常會被面試官問,從輸入URL到頁面加載完成,發生了什麼?css
瀏覽器緩存之客戶端緩存html
無需請求的memory cache,disk cache;前端
須要發請求驗證的Etag、Last-Modified304;vue
H5新增的 localStorage、sessionStorage;java
合理利用以上緩存,能夠很大程度上提升前端性能。node
1.若是不合並 === > 文件與文件之間有插入的上行請求,增長了N - 1 個網絡延遲;受丟包問題影響更嚴重;通過代理服務器時可能會被斷開webpack
2.若是合併 === > 首屏渲染時間變長; 文件緩存大面積失效nginx
3.公共庫合併、不一樣頁面的合併git
4.使用在線網站進行文件合併、使用 nodejs 實現文件合併
2.expires: Mon, 16 Mar 2020 09:50:27 GMT
3.last-modified: Thu, 15 Feb 2018 14:17:52 GMT
Memory Cache
內存緩存,短命,好比經常使用數據js裏,瀏覽器也有本身的策略,base64圖片,體積小的靜態資源
Service Worker Cache
是一種獨立於主幹線程以外的javascript線程,它脫離於瀏覽器窗體,算是幕後工做,能夠實現離線緩存,網絡代理等
圖片優化
2.png
由於 http 請求無狀態,因此須要 cookie 去維持客戶端狀態
cookie 生成方式:http response header 中的 set-cookie; js 中能夠經過document.cookie讀寫cookie
使用:用於瀏覽器端和服務器端的交互;客戶端自身數據的存儲
過時時間:expire
存儲限制:做爲瀏覽器存儲,大小4kb左右;須要設置過時時間 expire
cookie 存儲能力被 localstorage 代替
httponly 不容許 js 讀寫
cookie 中在相關域名下面 --- cdn的流量損耗 。 解決:cdn 的域名和主站的域名要分開
// 函數節流 每隔多少時間執行一次 const throttle = (func ,wait = 100) =>{ // 不管調用多少次,函數都是100毫秒執行一次 let lastTime =0; return(...args) =>{ let now = new Date().getTime() if(now - lastTime >wait) { func.apply(this.args) lastTime = now } } } let i =1; window.addEventListener('scroll',throttle(()=>{ // 使用作圖片懶加載 console.log(i) i+=1 },350))
/* 校驗用戶是否是重複,用戶輸入完,向後端發送請求 若是用戶每次輸入,都發生請求,形成請求過多 用戶中止輸入字符串350毫秒,在發出 */ const debounce = (func,wait = 350) =>{ let timer =0; return (...args)=>{ if(timer) { clearInterval(timer) } timer = setTimeout(() => { func.apply(this,args) }, wait); } } let i =1; window.addEventListener('scroll',debounce(()=>{ // 驗證 console.log(i) i+=1 },350))
lazy-load
對於一些圖片多,頁面長的網頁來講,若是每次打開頁面加載所有的網頁內容,頁面加載速度勢必會受到影響,若是每次打開網頁只將網頁可視區域的內容加載給用戶 ,將大大提升網頁瀏覽速度,同時也減輕服務器負載,咱們可使用lazyload.js來實現對圖片的延遲加載,當網頁圖片進入到瀏覽器可視區域時,纔會去請求服務器加載圖片。
// 獲取全部的圖片 const img = document.getElementsByTagName('img') // 獲取可視區域的高度 const viewHeight = window.innerHeight || document.documentElement.clientHeight; // num用於計算當前顯示到那一張圖片,避免每次都是從第一張開始檢查是否漏出 let num =0; function lazyload() { for(let i=num;i<img.length;i++) { // 用但是區域高度減去元素頂部距離可視區域頂部的高度 let distance = viewHeight - img[i].getBoundingClientRect().top // 若是可視區域高度大於等於元素頂部距離可視區域頂部的高度,說明元素露出 if(distance >=0) { // 給元素寫入真實的src,展現圖片 img[i].src = img[i].getAttribute('data-src') // 前i張圖片已經加載完畢,,下次從第i+1張開始檢查是否露出 num = i+1 } } } // 監聽scroll window.addEventListener('scroll',lazyload,false)
performance.getEntriesByType('navigation') 性能檢測
經過在瀏覽器控制檯輸入這個命令,就能夠檢測到網頁加載數據,檢測網頁加載性能
npm install -g lighthouse
安裝完以後運行,也是找的github網址,運行成功以後,會彈出一個生成的html頁面。
生成一個html文件,找到而後直接打開就行
瀏覽器渲染