http快取:當客戶端向服務端請求資源時,會先去到瀏覽器快取,如果瀏覽器快取有需要請求資源的副本,就可以直接從瀏覽器快取中提取,而不會去到伺服器。
常見的http快取都只能快取get方式請求響應的資源,不能處理其他型別的響應。
http快取都是從第二次請求開始的,當第一次請求資源時,伺服器會返回資源,並在請求頭中傳回資源的快取引數;第二次請求時,瀏覽器會對這些引數進行判斷,命中強快取的就返回200,不命中會把請求引數加到請求頭中傳給伺服器,判斷是否命中協商快取,命中協商快取返回304(簡單點來說就是服務端已經執行了get,但檔案未發生變化),否則伺服器會返回新的資源。
而http快取分為強快取和協商快取。強快取如果生效,不需要再和伺服器發生互動,而協商快取不管是否生效,都需要與服務端發生互動。
強快取在快取資料未失效的情況下(即cache-control的max-age沒有過期或者expires的快取時間沒有過期),那麼就會直接使用瀏覽器的快取資料,不會再向伺服器傳送任何請求。強制快取生效時,http狀態碼為200。這個方式頁面載入的速度很快,效能好,但是在這期間,如果服務端的資源修改了,頁面上是無法獲取的,因為它不會再向伺服器傳送請求了。就好比如我們在實際開發中,修改了某個頁面的樣式,在頁面上重新整理但修改的內容沒有生效,因為使用的是強快取,這時候就需要ctrl+f5。
header屬性:
expires(時間)
當第一次請求時伺服器返回的響應頭中沒有cache-control和expires或者cache-control和expires過期,也或者他的屬性設定為no-cache(不走強快取),那麼瀏覽器第二次請求時就會與伺服器進行協商,與伺服器對比判斷資源是否進行了更新。如果伺服器端的資源沒有修改,那麼就會返回304,告訴瀏覽器可以使用快取中的資料,這樣就減少了伺服器的傳輸壓力。如果資料有更新伺服器就會返回200狀態碼,伺服器就會返回更新後的資源並且將快取資訊一起返回。
當瀏覽器第一次向伺服器傳送請求時,會在響應頭中返回協商快取頭的屬性:etag和last-modified,其中etag返回的是乙個hash值,last-modified返回的是gmt格式的最後修改時間。瀏覽器第二次傳送請求時,會在請求頭中帶上與etag對應的if-not-match,這個值就是響應頭中返回的etag的值,last-modified對應if-modified-since。伺服器在接收到這兩個引數後會進行比較,如果返回304,則說明請求資源沒被修改,瀏覽器可以直接在快取中獲取資料,否則伺服器會直接返回資料。
etag/if-not-match是在http/1.1出現的,主要是解決以下問題:
(1)、last-modified標註的最後修改只能精確到秒級,如果某些檔案在1秒鐘以內,被修改多次的話,它將不能準確標註檔案的修改時間
(2)、如果某些檔案被修改了,但是內容並沒有任何變化,而last-modified卻改變了,導致檔案沒法使用快取
(3)、有可能存在伺服器沒有準確獲取檔案修改時間,或者與**伺服器時間不一致等情形
一般需要快取的資源有html頁面和其他靜態資源:
設定快取
靜態資源
靜態資源的快取一般是在web伺服器上配置,例如nginx,apache。
強快取情況下,只要快取還沒過期,就會直接從快取中取資料,就算伺服器端有資料變化,也不會從伺服器端獲取了,這樣就無法獲取到修改後的資料。決解的辦法有:在修改後的資源加上隨機數,確保不會從快取中取。
儘量減少304的請求,因為我們知道,協商快取每次都會與後台伺服器進行互動,所以效能上不是很好。從效能上來看盡量多使用強快取。
前端快取之HTTP快取
說真的,當自己還很小白的時候,明明修改了js的內容了,但是就是沒有載入成功,那時候感覺好神奇,好沒道理。後來知道了這是因為快取的原因。說實話,現在基於各種框架的開發,基本上沒有在業務 過程中關注快取的事情了,當然,不包括使用localstorage和cookie。今天自己學習了一些關於前端快取的東西...
http前端快取 二
文章分為三部分,我們先來統一梳理一下乙個快取請求的過程,然後從請求頭以及響應頭快取相關字段進行解析,最後總結一下前端需要了解的對於快取的操作 一 快取過程 當乙個使用者發起乙個靜態資源請求的時候,瀏覽器會通過以下幾步來獲取資源 當第一次傳送請求,http返回200的狀態碼,如果沒有關閉快取請求的話 ...
前端快取總結 HTTP快取
在前端面試中,可能或多或少都會被提及快取問題,而這個問題大多數都是作為業務中不得不考慮的乙個效能優化點,如果平時沒有怎麼關注或是特意去了解這塊的童鞋們,可能就是不太了解其中的原由,那麼今天我們就這個快取問題來細細分析,幫助一些還不是太明白的或是剛入門的前端童鞋們梳理梳理,理解理解,那就話不多說,開始...