瀏覽器緩存技術是提高前端性能一個很是重要的手段。在當前瀏覽器各方面性能都大幅提高的狀況下,前端性能的瓶頸更多的集中在資源請求方面。javascript
說瀏覽器緩存,其實就是在說:css
瀏覽器實現緩存的機制html
HTTP通信協議定義的關於緩存的字段內容前端
先讓咱們回顧下,當咱們在瀏覽器的地址欄輸入URL以後發生哪些過程:java
DNS服務器
解析域名,找到對應服務器的IP地址
;web
和服務器創建TCP鏈接
;數據庫
基於TCP鏈接
進行HTTP的Req/Res
,服務器會根據HTTP請求到數據服務器
取出相應的資源,並返回給前端;gulp
瀏覽器獲取HTML文檔,並開始解析
;瀏覽器
遇到link
標籤,加載href
指向的地址,並解析css
,遇到帶有src
屬性,且沒有聲明async或defer
屬性的script
標籤時,同步加載遠程js腳本
,同步解析js腳本,同步執行js腳本,瀏覽器的GUI渲染
過程處於掛起狀態。當js執行完畢後,繼續後面的HTML解析的工做;緩存
DOM樹
構建完畢,CSS Rules
解析完畢;
由DOM樹
和CSS Rules
一塊兒構建Render樹
。和DOM樹
不同的地方在於Render樹
是帶有DOM樣式的,僞元素
不會在DOM樹
中出現,而會在Render樹
中出現。
Render樹
構建完畢後開始repaint
和reflow
過程,即渲染
。最後將頁面呈現給用戶。
在這些過程中:
過程1:遠程服務器多是代理服務器
,代理服務器可進行緩存匹配,可將緩存的資源直接返回給前端,下降對於源服務器的壓力,同時還能作均衡負載;
過程3:數據服務器
能夠進行memcached
,進行數據庫層面的緩存,可將上一次的查詢結果緩存到內存當中,下次再查詢相同的數據時,直接從內容從取出數據;
過程5:能夠利用瀏覽器緩存
。這也是本文所講的主要內容。
當我訪問 SegmentFault 的我的主頁時:
在瀏覽器首次加載並解析HTML文檔時,會維護一個資源的緩存池
,緩存池
裏存放了加載的包括css,js,圖片,字體等文件,URL
是這些資源的惟一標識。瀏覽器會根據HTTP響應字段
來決定這些資源是否能緩存以及緩存的時間等:
Expires
字段設置了資源過時的時間。
Cache-control
字段的內容較多,例如no-cache會決定資源不會緩存;max-age指客戶機能夠接收生存期不大於指定時間(以秒爲單位)的響應。具體的內容(圖)
Etag
:資源的惟一標識符
Last-Modified
: 資源最後一次修改的時間
若是將頁面刷新,此時加載同一份HTML文件,一樣遇到外聯的css,js,圖片和字體等文件。此時瀏覽器首先會從緩存池中尋找,尋找的標記爲資源的URL地址。
若是緩存池中有對應的資源,經過查詢Expires字段
和Cache-control字段
的值,若是沒有過時,那麼會從緩存池中獲取資源,不會進行HTTP請求。
若資源過時,則會進行HTTP請求,此時瀏覽器會檢查緩存池中資源是否具備Etag
和Last-modified
.若是有Etag
字段(資源的惟一標識符,只要發生修改,其值都會發生改變)的內容,那麼HTTP請求中會帶上If-none-match
字段,其值爲Etag
字段的內容,若是有Last-Modified
字段(最後一次修改的時間),那麼HTTP請求會帶上If-Modified-Since
字段,其值爲Last-modified
字段的內容。服務器根據HTTP請求去匹配If-none-match
和If-Modified-Since
的內容。
當If-none-match
的內容匹配不成功時,服務器會返回狀態碼爲200 success
的響應及全部的資源內容,並設置新的和緩存相關的字段內容,若匹配成功返回304 Not Modify
響應狀態,可是不會返回資源內容。此時瀏覽器仍然是從資源池中獲取資源。
If-Modified-Since
的處理方式和If-none-match
相同。
當以上2個字段在HTTP請求中都存在時,會優先匹配If-None-Match
的內容,只有相同的狀況下才會去匹配If-Modified-Since
的內容,來絕對是返回200仍是304。
頁面首次加載
頁面刷新
以前在實習的過程當中,對於瀏覽器緩存所作的工做之一就是每次在發版前經過gulp給資源打上版本號,例如:
"/css/style.css" => "/dist/css/style.css?v=1d87bebe"; "/js/script1.js" => "/dist/script1.js?v=61e0be79";
這樣再去首頁去加載這些資源的時候,由於在資源池裏找不到對應的URL,所以會發送HTTP請求,從服務器端獲取最新的資源。 具體實踐過程請自行google
。
《webkit技術內幕》