深刻理解http請求的過程是前端性能優化的核心! css
注意: html
一、文件合併存在的問題。前端
二、資源的合併與壓縮(html,css,js壓縮和混亂,文件合併,開啓gzip)。vue
png8/png24/png32之間的區別?
ios
不一樣格式圖片的特色和經常使用的業務場景?
web
對圖片的優化有哪些?
canvas
HTMLParser解析器自上而下解析,生成DOM樹。
外部資源link、script,瀏覽器會發起請求。
解析CSS生成CSS規則樹,進而構建渲染樹(計算element位置,佈局layout)。
接着調用操做系統NativeGUI的API進行繪製。segmentfault
外部資源併發請求,一個域名下的併發請求數是有上限的。
因此通常將網站的靜態資源託管在多個CDN下。跨域
css在head中能夠阻塞頁面渲染、css能夠阻塞js執行,可是css不阻塞外部腳本的加載。promise
直接引入的js阻塞頁面的渲染(asyn[異步下載、當即執行]、differ[並行下載、順序執行]這兩種方式加載js例外)
js不阻塞資源的加載(預資源加載器)
js順序執行,阻塞後續js邏輯的執行(單線程)
懶加載:圖片進入可視區域以後請求圖片資源。
懶加載的實現:
1.JS判斷圖片是否進入可視區域。
2.當進入時,修改img
的src屬性爲實際圖片地址。
預加載:圖片等靜態資源在使用以前提早請求。
預加載實現:
1.使用標籤(<img src="xxx" style="display:none">)
2.使用Image
對象(new Image();)
3.使用XMLHTTPRequest
對象(資源跨域問題)
UI線程和js線程互斥。
css性能能讓JavaScript變慢。
頻繁觸發重繪
與迴流
,會致使UI頻繁渲染,最終致使js變慢。
迴流: 當render tree
中的一部分(或所有)由於元素的規模尺寸,佈局,隱藏等改變而須要從新構建,
這就稱爲迴流(reflow)。
獲取如下屬性時會引起迴流
:
width,height
offsetTop/Left/Width/Height
scrollTop/Left/Width/Height
clientTop/Left/Width/Height
調用了getComputedStyle(), 或者 IE的 currentStyle
重繪: 當render tree
中的一些元素須要更新屬性,而這些屬性只是影響元素的外觀,風格,而不會
影響佈局的,好比background-color
,這就稱爲重繪。
Chrome中知足如下任意狀況就會建立圖層:
video、canvas都是一個獨立的圖層。
經常使用的會獨立爲一個圖層的屬性:
transform:translateZ(0);
will-change:transform;
怎麼優化呢?
translate
(改變不會觸發瀏覽器從新佈局,可是元素仍會佔據原始位置)替代top
(會觸發從新佈局)改變。opacity
(不會觸發重繪)替代visibility
(會觸發重繪)。class
,而後修改DOM的className
。display:none
,而後修改100次,再把它顯示出來。)table
佈局,一個小的改動會形成整個table
的從新佈局。Cookie
由於HTTP請求無狀態,因此須要cookie
去維護客戶端狀態。
cookie的生成方式:
document.cookie
能夠讀寫cookie(客戶端自身數據的存儲)cookie存儲的限制:
對於cookie的優化:
cookie中在相關域名下面--cdn的流量損耗
解決方法:__ cdn的域名和主站的域名要分開 __
對於cookie的讀寫操做:
// 寫入 document.cookie = "username=hello"; // 讀取 let cookie = document.cookie; /** * param [String] cookie * return [Object] object */ function getCookie(cookie){ if(!cookie){ return null; } let reg = /\s*([^;]+)\s*=\s*([^;]+)\s*/g; let obj = {}; cookie.replace(reg,($0,$1,$2) => { if($1&&$2){ obj[$1] = $2; } }); return obj; }
cookie存儲數據能力被localstorage
替代。
httponly :不容許js讀寫。(防止盜用cookie)
對於LocalStorage的讀寫操做:
// 寫入 localStorage.setItem('username','hello') undefined // 讀取 localStorage.getItem('username') "hello"
對於 SessionStorage的讀寫操做:
// 寫入 SessionStorage.setItem('username','hello') undefined // 讀取 SessionStorage.getItem('username') "hello"
具體內容查看筆記:
ServiceWorker探索
ServiceWorker和cacheStorage緩存及離線開發
利用ServiceWorker進行多頁面通訊:
// 主頁面發送信息 navigator.serviceWorker.controller.postMessage(value); // 主頁面監聽消息 navigator.serviceWorker.addEventListener('message',event => { // console.log(event.data); }); // ServiceWorker接收信息(對其餘頁面消息分發) self.addEventListener('message',event => { let promise = self.clients.matchAll().then(clientList => { let senderID = event.source ? event.source : 'unknown'; clientList.forEach(client => { if(client.id === senderID){ return; } client.postMessage({ client: senderID, message: event.data }); }); }); event.waitUntil(promise); });
from memory cache
),expires
(到期時間http/1.0)和max-age
相比,max-age
具備更高的優先級。public
相關的緩存設備例如CDN,優先級高於max-age
,若是客戶端訪問到的是CDN服務器緩存中的數據切未更改則返回304狀態碼。(Cache-control:max-age=3600, s-maxage=31536000
,就算在max-age
時間內,也不直接加載本地文件,而是訪問CDN緩存。緩存中的文件若是沒有更改,則直接通知客戶端304,加載本地文件。感受和no-cache
很像呀)Cache-Control:private, max-age=0, no-cache
),不是不緩存的意思,它實際上的機制是,仍然對資源使用緩存,但每一次在使用緩存以前必須(MUST)向服務器對緩存資源進行驗證。Expires是http/1.0
中定義的瀏覽器緩存策略。(expires: Wed, 24 Jan 2018 12:19:34 GMT
)
可是last-modified是有缺點的。
不能
獲取精確的修改時間 此緩存策略優先級高於Last-Modified/If-Modified-Since
vue執行過程:
下載vue.js ==> 執行vue.js代碼 ==> 生成HTML頁面
隨着前端瀏覽器的性能的提高,大量的運算在前端執行。
使用vue框架出現了首屏性能、渲染問題。
優化方案?
vue
的runtime
中能夠直接執行的js代碼)prerender
的方式(將vue渲染完成的靜態頁面返回)