前言:這幾天應老大要求,對前端存儲進行調研。以前校招的時候理解的不全面,感受還迷迷糊糊的,只知其一;不知其二,如今本身系統梳理一遍,總算明白了這些東西是怎麼一回事,但願可以幫助接下去參加校招的小盆友以及在前端路上一塊兒前行的小夥伴們。q(≧▽≦q)javascript
系統梳理前端存儲,總結他們的特色、兼容性等,並進行對比,找出其各自的應用場景。html
Chrome:前端
搜狗瀏覽器:html5
好處(一切爲了提高用戶體驗 :D):java
HTTP Cookie,最初用於在客戶端存儲會話信息。該標準要求服務器對任意 HTTP 請求發送 Set-Cookie HTTP 頭做爲響應的一部分,其中包含會話信息。瀏覽器會存儲這樣的會話信息,並在這以後,經過爲每一個請求添加 Cookie HTTP 頭將信息發送回服務器。web
【舉例以下】:sql
服務器響應頭:數據庫
瀏覽器響應頭:segmentfault
在 JavaScript 中能夠經過 document.cookie 設置字段和進行訪問。windows
// 設置 cookie 字段 document.cookie = 'name=Lucy'; // 更好的設置方式: document.cookie = encodeURIComponent('age') + '=' + encodeURIComponent(25); // 訪問 cookie document.cookie // 刪除 cookie(設置存儲有效時長爲過去時間) var date = new Date(); date.setDate(date.getDate() + '設置時長'); document.cookie = 'name=Lucy;expires=' + date.toUTCString();
cookie 由瀏覽器保存的如下幾塊信息構成:名稱、值、域、路徑、失效時間、安全標誌。
【舉例說明】:
該頭信息指定了一個叫作 name 的 cookie,會在格林威治時間2007年1月22日7:10:24失效(日期過時時,會當即失效),同時對於 www.wrox.com 和 wrox.com 的任何子域都有效。
secure 標誌是 cookie 中惟一一個非名值對兒的部分,直接包含一個 secure 單詞。以下:
注意:域、路徑、失效時間和 secure 標誌都是服務器給瀏覽器的指示,以指定什麼時候應該發送 cookie。這些參數並不會做爲發送到服務器的 cookie 信息的一部分,只有名值對兒纔會被髮送。
cookie 的 session 不一樣於 sessionStorage 的 session,cookie 的 session 是指在未關閉瀏覽器的狀況下,全部的 tab 級別的頁面或新開,或刷新,均屬於一個 session。
優勢:
缺點:
通常非到不得已,不要在 cookie 裏面存東西,更不要存儲重要和敏感的數據。若是要存儲的話,建議存儲一些同步訪問頁面的時候必需要被帶到服務端的信息。
- 客戶端登陸,用於保存用戶信息。如「下次自動登陸」的選項,勾選以後下次就不須要重複驗證。經過 cookie 能夠保存用戶的 id。
- 建立購物車。能夠實現不一樣頁面之間的數據同步(同一個域名下是能夠共享cookie的),同時在提交訂單的時候又會把這些cookie傳到後臺。
- 跟蹤用戶行爲。例如百度聯盟會經過cookie記錄用戶的偏好信息,從而推薦個性化推廣信息,如頁面上的小廣告。這是能夠禁用的,也是cookie的缺點之一。
定義了兩種用於存儲數據的對象:sessionStorage 和 localStorage,後二者是Storage的實例。
注意:Storage 類型只能存儲字符串。非字符串的數據在存儲以前會被轉換成字符串。
【瀏覽器兼容性】:
大多數瀏覽器對 webstorage 的支持狀況還算不錯,具體請參閱:http://caniuse.com/#search=webstorage
Local Storage 的兼容性方案實現:LocalStorage Compability
這兩個對象在瀏覽器中都是以 windows 對象屬性的形式存在,在 JavaScript 中能夠直接經過 sessionStorage 和 localStorage 訪問。
1) 使用:
2) 訪問限制:
3) 特色及應用場景:
- 主要用於僅針對會話的小段數據的存儲。
- 建議存儲一些當前頁面刷新須要存儲,且不須要在tab關閉時候留下的信息。
- 能夠用來檢測用戶是不是刷新進入的頁面,如音樂播放器恢復播放進度條的功能。
- 很是適合單頁應用程序,能夠方便在各業務模塊進行傳值。
1) 使用: 同 sessionStorage
2) 訪問限制:
3) 特色及應用場景:
- 持久保存客戶端數據,數據保留到經過JavaScript刪除或者用戶清除瀏覽器緩存。
- 若是有一些數據,服務器難以承載其壓力,但又要與用戶的信息綁定,可使用 localStorage 存儲一些狀態,這樣既能緩解服務器壓力,也能夠存儲用戶的數據。
- 數據比較大的臨時保存方案。如在線編輯文章時的自動保存。
- 多頁面訪問共同數據。sessionStorage只適用於同一個標籤頁,localStorage相比而言能夠在多個標籤頁中共享數據。
Storage 類型只能存儲字符串。若是存儲的是對象,能夠將對象序列化爲字符串再存入。(如下以 localStorage 進行說明,sessionStorage 一樣適用)
Web Storage 的限制因瀏覽器而異。通常來講,對存儲空間大小的限制都是以每一個來源(協議、域和端口)爲單位的,即每一個來源都有固定大小的空間用於保存本身的數據。對於 localStorage 而言,大多數桌面瀏覽器會設置每一個來源 5MB 的限制。對 sessionStorage 的限制也是因瀏覽器而異。
有關 Web Storage 的限制,參考:Web Storage Support Test
對於 Storage 的大小檢測,能夠將 localStorage 和 sessionStorage 序列化,而後查看其字節數:
對 Storage 對象進行任何操做,都會在文檔上觸發 storage 事件,該事件的 event 對象有如下屬性:
使用時須要檢測 WebKit 是否支持 storage 事件。
Web Storage 是爲了更大容量存儲設計的,而Cookie的大小是受限的。
cookie 在每次請求一個新的頁面的時候都會被髮送過去,在瀏覽器和服務器間來回傳遞,這樣無形中浪費了帶寬。
cookie 能夠設定訪問域,在同源窗口中能夠共享,而 web storage 受同源策略限制。
可是Cookie也是不能夠或缺的:Cookie的做用是與服務器進行交互,做爲HTTP規範的一部分而存在 ,而Web Storage僅僅是爲了在本地「存儲」數據而生。
(本小節詳細內容請參考:聊一聊前端存儲那些事兒)
websql 像關係型數據庫,使用 sql 語句進行操做。
indexdb 像 nosql,直接使用 js 方法操做數據。
訪問:indexdb 和 websql 與 web storage 一致,均是在建立數據庫的域名下才能訪問。且不能指定訪問域名。
存儲時間:這兩位的存儲時間也是永久,除非用戶清除數據,能夠用做長效的存儲。
大小限制:理論上講,這兩種存儲的方式是沒有大小限制的。然而indexeddb的數據庫超過50M的時候瀏覽器會彈出確認。基本上也至關於沒有限制了。
性能測試:indexeddb查詢少許數據花費差很少20MS左右。大量數據的狀況下,相對耗時會變長一些,可是也就在30MS左右,也是至關給力了,10W數據+,畢竟nosql。
而 websql 的效率也不錯,10w+數據,簡單查詢一下,只花費了20MS左右。
說明:indexDB 目前兼容性還不是很好,Web SQL 雖然已通過時,可是其兼容性卻很是好,幾乎是移動端都可用(兼容性對比查看請移步:http://caniuse.com/#search=websql 以及 http://caniuse.com/#search=indexdb)。
所以,能用 indexdb,就用 indexdb,由於其表明了將來的發展方向,若是不能使用盡可能使用 websql 進行代替。
IndexDB 設計的操做徹底是異步的。所以,大多數操做會以請求的方式進行,但這些操做會在後期執行,若是成功則返回結果,若是失敗則返回錯誤。差很少每一次 IndexDB 操做,都須要你註冊 onerror 或 onsuccess 事件處理程序,以確保適當地處理結果。
打開數據庫時,實質上返回了一個DB對象,該對象存在於 result 中。
當咱們是在作一個離線應用,或者webapp的時候,能夠考慮使用本地數據庫中存取數據。若是不存大量的數據的話,其實localStorage就夠用了。亦或者,你想把一張用戶的皮膚圖片之類的大量數據存入客戶端緩存起來,localStorage已經不夠用了的話,也能夠嘗試一下websql與indexeddb。
《JavaScript 高級程序設計》
聊一聊前端存儲那些事兒:圖文並茂,講的很淺顯易懂
本地存儲和離線緩存:介紹本地存儲和離線緩存的區別
Web Storage Support Test:查看瀏覽器對 webstorage 的大小限制
經常使用的本地存儲——cookie篇:詳細介紹cookie及其應用場景
菜鳥教程-HTML5 Web存儲:web storage 的應用例子
下一代 Web 應用模型 —— Progressive Web App:提到了 Service Workers
MDN相關資源:LocalStorage、SessionStorage、IndexDB