前端Web 存储 简介

    技术2022-07-11  95

    1.cookie(又名 webcookie/浏览器cookie)

    cookie 主要用于以下三个方面:

    会话状态管理(用户登录状态、购物车、游戏分数或其它需要记录的信息)个性化设置(用户自定义设置、主题等)浏览器行为跟踪(跟踪分析用户行为等)

    特点:

    cookie 的大小受限,一般为 4 KB

    同一个域名下存放 cookie 的个数是有限制的,不同浏览器的个数不一样,一般为 20 个

    cookie 可设置过期时间,当过期时自动销毁

    每次发起同域下的 HTTP 请求时,都会携带当前域名下的cookie

    支持设置为 HttpOnly,防止cookie被客户端的 JavaScript 访问

    2.localStorage

    属于永久性储存,只要不手动清除是不会自己消失的。相比于cookie能存更大更多的数据。

    特点:

    大小限制为 5MB ~10MB在同源的所有标签页和窗口之间共享数据数据只保存在客户端,不主动与服务器进行通信数据持久存在且不会过期,重启浏览器后仍然存在对数据的操作是同步的

    3.sessionStorage

    属于短暂性储存,关闭浏览器就自动清除。等同于服务端的session(区别详见:https://blog.csdn.net/sylvia_0815/article/details/104393923)。sessionStorage 的作用域是窗口级的,也就是说不同窗口之间保存的 sessionStorage 数据是不能共享的。

    特点:

    sessionStorage 的数据只存在于当前浏览器的标签页数据在页面刷新后依然存在,但在关闭浏览器标签页之后数据就会被清除与 localStorage 拥有统一的 API 接口对数据的操作是同步的

    4.IndexedDB

    一种底层 API,用于客户端存储大量结构化数据,包括文件、二进制大型对象。该 API 使用索引来实现对该数据的高性能搜索。虽然 Web Storage 对于存储较少量的数据很有用,但对于存储更大量的结构化数据来说,这种方法不太好用。IndexedDB 提供了一个解决方案。

    特点:

    存储空间大:存储空间可以达到几百兆甚至更多

    支持二进制存储:它不仅可以存储字符串,而且还可以存储二进制数据

    IndexedDB 有同源限制,每一个数据库只能在自身域名下能访问,不能跨域名访问

    支持事务型:IndexedDB 执行的操作会按照事务来分组的,在一个事务中,要么所有的操作都成功,要么所有的操作都失败

    键值对存储:IndexedDB 内部采用对象仓库(object store)存放数据。所有类型的数据都可以直接存入,包括 JavaScript 对象。对象仓库中,数据以 “键值对” 的形式保存,每一个数据记录都有对应的主键,主键是独一无二的,不能有重复,否则会抛出一个错误

    数据操作是异步的:使用 IndexedDB 执行的操作是异步执行的,以免阻塞应用程序

    例:

    var dbName = "my_db"; var request = indexedDB.open(dbName, 2); request.onerror = function(event) { // 错误处理 }; request.onupgradeneeded = function(event) { var db = event.target.result; // 建立一个对象仓库来存储我们客户的相关信息,我们选择 ssn 作为键路径(key path) // 因为 ssn 可以保证是不重复的 var objectStore = db.createObjectStore("customers", { keyPath: "ssn" }); // 建立一个索引来通过姓名来搜索客户。名字可能会重复,所以我们不能使用 unique 索引 objectStore.createIndex("name", "name", { unique: false }); // 使用邮箱建立索引,我们确保客户的邮箱不会重复,所以我们使用 unique 索引 objectStore.createIndex("email", "email", { unique: true }); // 使用事务的 oncomplete 事件确保在插入数据前对象仓库已经创建完毕 objectStore.transaction.oncomplete = function(event) { // 将数据保存到新创建的对象仓库 var customerObjectStore = db.transaction("customers", "readwrite").objectStore("customers"); customerData.forEach(function(customer) { customerObjectStore.add(customer); }); }; };

     

    Processed: 0.013, SQL: 9