http緩存用於客戶端儲存一些不常常變化的靜態文件(圖片、css、js等)。分爲強制緩存和協商緩存。javascript
http緩存過程css
請求 => 是否命中強緩存 => 是否命中協商緩存 => 獲取資源vue
http緩存流程圖 java
緩存規則web
瀏覽器在請求某一資源時,會先獲取該資源緩存的header信息,判斷是否命中強緩存(cache-control和expires信息),若命中直接從緩存中獲取資源信息,包括緩存header信息,本次請求就不會與服務器進行通訊。數據庫
緩存方案跨域
Expires:response header裏的過時時間,瀏覽器再次加載資源時,若是在這個過時時間內,則命中強緩存。瀏覽器
Cache-Control:當值設爲max-age=300時,則表明在這個請求正確返回時間(瀏覽器也會記錄下來)的5分鐘內再次加載資源,就會命中強緩存。緩存
值能夠是public、private、no-cache、no- store、no-transform、must-revalidate、proxy-revalidate、max-age 各個消息中的指令含義以下:服務器
Public指示響應可被任何緩存區緩存。
Private指示對於單個用戶的整個或部分響應消息,不能被共享緩存處理。這容許服務器僅僅描述當用戶的部分響應消息,此響應消息對於其餘用戶的請求無效。
no-cache指示請求或響應消息不能緩存
no-store用於防止重要的信息被無心的發佈。在請求消息中發送將使得請求和響應消息都不使用緩存。
max-age指示客戶機能夠接收生存期不大於指定時間(以秒爲單位)的響應。
min-fresh指示客戶機能夠接收響應時間小於當前時間加上指定時間的響應。
max-stale指示客戶機能夠接收超出超時期間的響應消息。若是指定max-stale消息的值,那麼客戶機能夠接收超出超時期指定值以內的響應消息。
緩存規則
若是沒有命中強緩存,瀏覽器會發送請求到服務器,請求會攜帶第一次返回的有關緩存的header字段信息(Last-Modifued/If-Modified-Since和Etag/If-None-Match),由服務器根據header信息來比對結果是否協商緩存命中。若命中,則服務器返回新的響應header信息更新緩存中的對應header信息,可是不返回資源內容,它會告知瀏覽器能夠直接從緩存獲取;不然返回最新的資源內容。
緩存方案
Last-Modify/If-Modify-Since:瀏覽器第一次請求一個資源的時候,服務器返回的header中會加上Last-Modify,Last-modify是一個時間標識該資源的最後修改時間;當瀏覽器再次請求該資源時,request的請求頭中會包含If-Modify-Since,該值爲緩存以前返回的Last-Modify。服務器收到If-Modify-Since後,根據資源的最後修改時間判斷是否命中緩存
Etag/If-None-Match:web服務器響應請求時,告訴瀏覽器當前資源在服務器的惟一標識(etag)(生成規則由服務器決定)。當資源過時時(使用Cache-Control標識的max-age),發現資源具備Etag聲明,則再次向web服務器請求時帶上頭If-None-Match (Etag的值)。web服務器收到請求後發現有頭If-None-Match 則與被請求資源的相應校驗串進行比對,決定是否命中協商緩存;
localStorageh和sessionStorage 都只擁有大約5M的存儲空間,不適用於存儲大數據量數據。對於數據量較大的數據緩存,咱們應該應用本地數據庫實現(indexDB)
IndexedDB 具備如下特色。
(1)鍵值對儲存。
IndexedDB 內部採用對象倉庫(object store)存放數據。全部類型的數據均可以直接存入,包括 JavaScript 對象。對象倉庫中,數據以"鍵值對"的形式保存,每個數據記錄都有對應的主鍵,主鍵是獨一無二的,不能有重複,不然會拋出一個錯誤。
(2)異步。
IndexedDB 操做時不會鎖死瀏覽器,用戶依然能夠進行其餘操做,這與 LocalStorage 造成對比,後者的操做是同步的。異步設計是爲了防止大量數據的讀寫,拖慢網頁的表現。
(3)支持事務。
IndexedDB 支持事務(transaction),這意味着一系列操做步驟之中,只要有一步失敗,整個事務就都取消,數據庫回滾到事務發生以前的狀態,不存在只改寫一部分數據的狀況。
(4)同源限制
IndexedDB 受到同源限制,每個數據庫對應建立它的域名。網頁只能訪問自身域名下的數據庫,而不能訪問跨域的數據庫。
(5)儲存空間大
IndexedDB 的儲存空間比 LocalStorage 大得多,通常來講很多於 250MB,甚至沒有上限。
(6)支持二進制儲存。
IndexedDB 不只能夠儲存字符串,還能夠儲存二進制數據(ArrayBuffer 對象和 Blob 對象)。
localforage
的vue項目本地緩存數據到indexDB數據庫的實例代碼<script type="text/ecmascript-6">
import localforage from 'localforage'
export default {
data () {
return {
db: null,
canIndexedDB:false
}
},
mounted () {
this.initIndexedDB()
},
methods: {
async getStoreList (key) {
let resData = []
if ( !this.canIndexedDB){
resData = getAllData()
}else{
let cache = await this.db.getItem(key)
if (cache) {
resData = cache
}else{
resData = getAllData()
}
console.log(resData);
}}
initIndexedDB () {
this.canIndexedDB = localforage.supports(localforage.INDEXEDDB)
if (this.canIndexedDB) {
this.db = localforage.createInstance({
name: 'cacheName',
driver: localforage.INDEXEDDB
})
window.db = this.db
} else {
this.db = null
}
},
},
}
</script>
複製代碼