瀏覽器的本地存儲主要分為、和, 其中又可以分為和。
最開始被設計出來其實并不是來做本地存儲的,而是為了彌補HTTP在狀態管理上的不足。
HTTP 協議是一個無狀態協議,客戶端向服務器發請求,服務器返回響應,故事就這樣結束了,但是下次發請求如何讓服務端知道客戶端是誰呢?
這種背景下,就產生了 .
本質上就是瀏覽器里面存儲的一個很小的文本文件,內部以鍵值對的方式來存儲(在開發者面板的這一欄可以看到)。向同一個域名下發送請求,都會攜帶相同的 ,服務器拿到 進行解析,便能拿到客戶端的狀態。
的作用很好理解,就是用來做狀態存儲的,但它也是有諸多致命的缺陷的:
1.容量缺陷。 的體積上限只有4KB微信瀏覽器 本地存儲,只能用來存儲少量的信息。
2.性能缺陷。 緊跟域名,不管域名下面的某一個地址需不需要這個 ,請求都會攜帶上完整的微信瀏覽器 本地存儲,這樣隨著請求數的增多,其實會造成巨大的性能浪費的,因為請求攜帶了很多不必要的內容。
3.安全缺陷。由于 以純文本的形式在瀏覽器和服務器中傳遞,很容易被非法用戶截獲,然后進行一系列的篡改,在 的有效期內重新發送給服務器,這是相當危險的。另外,在為 false 的情況下, 信息能直接通過 JS 腳本來讀取。
和異同
有一點跟一樣,就是針對一個域名,即在同一個域名下,會存儲相同的一段。
不過它相對還是有相當多的區別的:
1.容量。 的容量上限為5M,相比于的 4K 大大增加。當然這個 5M 是針對一個域名的,因此對于一個域名是持久存儲的。
2.只存在客戶端,默認不參與與服務端的通信。這樣就很好地避免了 帶來的性能問題和安全問題。
3.接口封裝。通過暴露在全局,并通過它的 和 等方法進行操作,非常方便。
特點
以下方面和一致:
1.容量。容量上限也為 5M。
2.只存在客戶端,默認不參與與服務端的通信。
3.接口封裝。除了名字有所變化,存儲方式、操作方式均和一樣。
但和有一個本質的區別,那就是前者只是會話級別的存儲,并不是持久化存儲。會話結束,也就是頁面關閉,這部分就不復存在了。
是運行在瀏覽器中的非關系型數據庫, 本質上是數據庫,絕不是和剛才的 5M 一個量級,理論上這個容量是沒有上限的。
關于它的使用,本文側重原理,而且 MDN 上的教程文檔已經非常詳盡,這里就不做贅述了,感興趣可以看一下使用文檔。
接著我們來分析一下的一些重要特性,除了擁有數據庫本身的特性,比如支持事務,存儲二進制數據,還有這樣一些特性需要格外注意:
1.鍵值對存儲。內部采用對象倉庫存放數據,在這個對象倉庫中數據采用鍵值對的方式來存儲。
2.異步操作。數據庫的讀寫屬于 I/O 操作, 瀏覽器中對異步 I/O 提供了支持。
3.受同源策略限制,即無法訪問跨域的數據庫。
總結
瀏覽器中各種本地存儲和緩存技術的發展,給前端應用帶來了大量的機會,PWA 也正是依托了這些優秀的存儲方案才得以發展起來。重新梳理一下這些本地存儲方案:
并不適合存儲,而且存在非常多的缺陷。
Web 包括和, 默認不會參與和服務器的通信。
為運行在瀏覽器上的非關系型數據庫,為大型數據的存儲提供了接口。