最近在項目中使用了部分的前端存儲,以前只有一些簡單的瞭解,今天就趁這個機會把前端存儲進行深刻研究一番。javascript
首先咱們應該先清除大概都有哪些存儲方式,對此咱們只須要打開控制檯,選擇 application 來進行查看。html
咱們能夠看到,存儲大概分爲兩大類,一類爲 存儲類 ,另外一類爲 緩存類。前端
Web存儲 (Web Storage):HTML 5 中提出的存儲方式,容量有 5 M。java
Cookie:瀏覽器廣泛支持的基於 HTTP 協議的存儲方式,但容量只有 4 KBgit
數據庫存儲:github
HTTP Cookie,它最初適用於客戶端存儲會話信息的、這個標準要求服務器對 HTTP 請求設置 Set-Cookie HTTP 頭做爲響應的一部分,其中會包含有會話信息。瀏覽器在 Cookie 中存儲繪畫信息,並在發送請求時將 Cookie 一塊兒發送過去。web
咱們先打開 github 以後進入控制檯查看一下sql
域 路徑 失效時間 和 安全性 都是服務器給瀏覽器的指示,他們不會隨着請求發送給服務器,發送給服務器的只有名稱與值對。數據庫
優勢:跨域
1. 能夠控制過時時間,不會永久有效,有必定的安全保障。
2. 可進行擴展,可跨域共享。
3. 經過加密與安全傳輸技術 (SSL) ,能夠減小 Cookie 被破解的可能性。
4. 有較高的兼容性。
複製代碼
缺點:
1. 有必定的數量與長度限制,每一個 Cookie 長度不能超過 4 KB ,不然超出部分會被截掉。
2. 請求頭上的數據容易被攔截攻擊。
複製代碼
LocalStorage 與 SessionStorage
咱們能夠先看一下它的兼容性,許多瀏覽器已經徹底支持了它:
它們都是直接做爲 window
對象的屬性存在的,咱們能夠直接經過 window.localStorage
與 window.sessionStorage
來訪問。
同時,咱們觀察到 Web Storage 只能儲存字符串,若是用 Web Storage 存儲對象,會出現
[Object Object]
, 能夠用JSON.stringify
與JSON.parse
方法來解決這個問題。
使用的場景:
1. 主要針對會話級的小數據的存儲。
2. 存儲一些在當前頁面刷新仍然須要存儲,可是關閉後不須要留下的信息。
3. 很適合單頁應用的使用,能夠用來存儲登陸態信息等。
複製代碼
使用的場景:
1. 持久性的保存客戶端數據,只能經過 JavaScript 刪除或者用戶清除瀏覽器緩存。
2. 若是有一些稍大量的數據,例如編輯器的自動保存等。
3. 多頁面間訪問共同數據。 sessionStorage 只能用於一個標籤頁,而localStorage能夠在多個標籤頁之間共享。
複製代碼
咱們對 Storage 對象進行任何的操做,都會在文檔上觸發 Storage 事件, 這個事件的 event 對象有如下屬性:
Web SQL 相似關係型數據庫, 它使用 sql 語句進行相關操做。
indexDB 相似 NoSQL , 直接使用 js 的方法操做數據。
第一步打開數據庫
var request = indexedDB.open(name, version);
複製代碼
第一個參數爲數據庫的名稱,第二個參數爲數據庫的版本號。
第二步添加數據
建立事務,並加上數據讀寫權限。
var transaction = db.transaction(storeName, 'readwrite');
複製代碼
獲取 objectStore 再調用add方法添加數據
var store = transaction.objectStore(storeName);
var request = store.get(key);
request.onsuccess = function (e) {
data = e.target.result;
console.log(student.name);
};
複製代碼
第三步刪除數據
刪除也須要建立事務,調用刪除接口 ,經過key刪除對象。
var transaction = db.transaction(storeName, 'readwrite');
var store = transaction.objectStore(storeName);
store.delete(key);
複製代碼
第四步查找數據
按key查找
開啓事務,獲取到 objectStore ,調用get()方法獲取對象。
var transaction = db.transaction(storeName, 'readwrite');
var store = transaction.objectStore(storeName);
var request = store.get(key);
request.onsuccess = function (e) {
data = e.target.result;
console.log(student.name)
};
複製代碼
使用索引查找
咱們在使用索引以前須要先建立索引,它使用 createIndex
方法建立索引,方法有三個參數: 索引名稱、索引屬性字段名,索引屬性值是否惟一。
objectStore.createIndex('name','name', {
unique: false
})
複製代碼
建立好了索引,咱們就可使用索引進行查詢:
var transaction = db.transaction(storeName);
var store = transaction.objectStore(storeName);
var index = store.index(search_index);
index.get(value).onsuccess = function (e) {
data = e.target.result;
console.log(student.id);
}
複製代碼
遊標遍歷數據
var transaction = db.transaction(storeName);
var store = transaction.objectStore(storeName);
var request = store.openCursor(); //成功打開遊標
var dataList = new Array();
var i = 0;
request.onsuccess = function (e) {
var cursor = e.target.result;
if (cursor) {
console.log(cursor.key);
dataList[i] = cursor.value;
console.log(dataList[i].name);
i++;
cursor.continue();
}
data = dataList;
}
複製代碼
第五步,更新對象
爲了更新對象,咱們首先要把它取出來,進行修改以後再放回去。
var transaction = db.transaction(storeName, 'readwrite');
var store = transaction.objectStore(storeName);
var request = store.get(key);
request.onsuccess = function (e) {
var data = e.target.result;
for (a in newData) {
data.a = newData.a;
}
store.put(data);
}
複製代碼
第六步,關閉與刪除
關閉數據庫須要調用數據庫的 close 方法
db.close();
複製代碼
刪除數據庫使用數據庫對象 deleteDatabase 方法
function deleteDB (name) {
indexedDB.deleteDatabase(name);
}
複製代碼
indexDB 的兼容性仍是一大問題,Web SQL 雖然過期,但兼容性卻仍然很是好,移動端幾乎都可用。
Cache Storage
是用來存儲 Response
對象 ,也就是對 HTTP 響應進行緩存。 Cache Storage
是多個 cache
的集合,每一個 cache
能夠存儲多個響應對象。它基於 Promise。這裏不作詳細的贅述。
它是 HTML5 中新引入的應用程序換粗技術,它的出現意味着 web 應用能夠經過緩存,在沒有網絡的環境下運行,構建離線應用。
優勢:
通常來講 Application Cache
只用來存儲一些靜態資源,它的使用方式主要須要兩個步驟:
1.服務端維護一個 manifest
清單
2.瀏覽器端進行一個設置。
<html manifest="demo">
複製代碼
通常的,咱們必須給 manifest 文件設置正確的 MIME-type 爲 "text/cache-manifest",它須要在服務器端進行配置。
在 Progressive Web Application 中, Application Cache 配合 Service Worker 承擔着主要的任務。
參考文獻
MDN: LocalStorage , sessionStorage, indexDB