最近在项目中使用了部分的前端存储,以前只有一些简单的了解,今天就趁这个机会把前端存储进行深刻研究一番。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