前端浏览器Storage存储的五种方式

一、存储方式对比

存储方式数据存储方式数据范围数据持久性数据容量数据访问方式
Cookie键值对特定域名下的本地环境默认是浏览器关闭就会销毁,也可以通过setMaxAge方法设置Expires/Max-age属性,来决定有效期一个域名domain下,单cookie总大小在4KB以内,总条数一般有限。只适合存放身份认证信息。JavaScript API
LocalStorage键值对特定域名下的本地环境持久性,浏览器关闭后仍保留通常为5MB或更大JavaScript API
SessionStorage键值对特定域名下的本地环境非持久性,浏览器关闭后被删除通常为5MB或更大JavaScript API
IndexedDB对象存储特定域名下的本地环境持久性,浏览器关闭后仍保留数百MB或更大异步API
Web SQL关系型数据库特定域名下的本地环境持久性,浏览器关闭后仍保留数百MB或更大SQL语句和异步API

二、详细介绍

1、cookies

在这里插入图片描述

参数介绍:

  • name和value是键值对,也就是常用的部分
  • domain指的是域名,在该域名下的请求,才会携带此cookie,且对子域名也生效,domain参数以(“.”)符号点开始。
  • path指的是cookie的有效路径,同样是会对子路径生效,path参数以(“/”)符号点结尾。
  • Expires/Max-age指的是cookie的有效期,expires是cookie失效的时间戳(服务器时间), max-age是几秒后失效,单位为秒,默认为-1。
  • size指的是大小,各浏览器大小不同,如下表:
浏览器Cookie最大条数Cookie最大长度/单位:字节
IE504095
Chrome1504096
FireFox504097
Opera304096
Safari无限4097
  • httpOnly
    true: document.cookie不可见该条cookie,也不可修改,但请求还是会携带。
    false: 默认值,可见可修改,请求会携带。
    Secure是安全属性,若为true,则只能在https和ssl等安全协议中传输
    SameSite是用来限制第三方Cookie,有三个属性值
Strict,最严格,完成禁止第三方Cookie,跨站点时,任何情况下都不会发送Cookie;
Lax是大多数情况不发送第三方Cookie,但get请求会携带;
None,不做限制,但必须Secure是true。
  • Priority优先级,属性值low/medium/high,当cookie数量超出的时候,低优先级的cookie会被清除。

使用方法

import Cookies from 'js-cookie'
const TokenKey = '键名'
const token = 'token值'
// 存储
Cookies.set(TokenKey, token)
// 获取
Cookies.get(TokenKey)

2、local storage

详细介绍:

  • 为了弥补cookie存储大小不足,在h5里新增的一项存储技术Web storage,它分为local storage 和session storage两种,本质上两种不存在区别,唯一区别的是local storage是长期存储,session storage是会话存储(标签页关闭就会清除)。而且请求时,并不会带上web storage存储的值(这点和cookie不一样)。
  • local storage要求是同协议,同域名,同端口,就能共享或修改同一份localStorage数据。
  • session storage则要求同协议,同域名,同端口,同窗口(即同个浏览器标签页)

使用方法

官方api有以下几种:
getItem 获取
setItem 设置
removeItem  移除
clear 清空

localStorage.getItem('key') // 获取键名为key的值
localStorage.setItem('key','value') // 设置键名为key,并赋值,若存在就会
//修改属性值,这里的value必须是字符串,若是对象可以调用JSON.stringify(obj)
//来序列化成字符串
localStorage.removeItem('key') // 移除键名为key的值
localStorage.clear('key') // 清空所有值

当然,因为local storage是数组,所以数组的增删改查也可以对其生效。不过不推荐。

3、session storage

  • 这部分跟local storage一致,参照local storage

4、web sql

详细介绍:

  • Web SQL 数据库 API 并不是 HTML5 规范的一部分,但是它是一个独立的规范,引入了一组使用 SQL 操作客户端数据库的 APIs,相当于是在浏览器中内置了一个sqlite关系型数据库,不过操作是由js去操作sql来实现的。
  • 不过web sql存在兼容性差的限制,只能在最新版的 Safari, Chrome 和 Opera 浏览器中使用,ie和Firefox则均不支持。

使用方法:

  • 核心方法就三个
  1. openDatabase:这个方法使用现有的数据库或者新建的
    数据库创建一个数据库对象。
  2. transaction:这个方法让我们能够控制一个事务,以及
    基于这种情况执行提交或者回滚。
  3. executeSql:这个方法用于执行实际的 SQL 查询。
  • 打开or创建数据库openDatabase
// 数据库名称,版本号,描述文本,容量大小, 回调函数(非必选)
var db = openDatabase('mydb', '1.0', 'Test DB', 2 * 1024 * 1024);

执行查询transaction,里面去调用executeSql函数,参数的基本语句和mysql的一致。

 db.transaction(function (tx) { 
      tx.executeSql('CREATE TABLE IF NOT EXISTS LOGS (id unique, log)'); 
  });

5、indexedDB

indexDB是一款对象型数据库,它会在客户端本地根据网址等创建具体文件数据,indexDB(浏览器数据库)本机存储文件夹在以下路径(以google为例)。

  • windows版本  C:\Users\ ‘当前的登录用户’\AppData\Local\Google\Chrome\User Data\Default\IndexedDB\

  • linux版本 /home/[当前登录用户]/.config/google-chrome/Default/IndexedDB/

indexDB一共有以下几个特性:
a、键值对储存。 主键独一无二
b、异步。 异步操作,防止操作数据库时,拖慢网页。
c、支持事务。 这意味着,如果事务中有一步失败,数据库将回滚到事务发生前的状态。
d、同源限制。 每个数据库是根据域名创建的,网页只能访问自身域名下的数据库,禁止跨域访问。
e、存储空间大。 一般浏览器会分配50m-250m这个值,但也受硬盘大小影响,可以没有上限。
f、支持二进制存储。 这点和web storage不同,意味着不需要额外转成字符串才能进行存储。
g、兼容性。
(1)IE10起支持
(2)Firefox 10、Chrome 23、Opera 15
(3)最新版的桌面版或移动版的Safari也支持IndexedDB。

如何使用

  • indexDB的使用分3步
    a、打开数据库DB
    b、在versionChange事件中 创建表(ObjectStore),包括定义表的键,索引规则等。
    c、操作数据(增删改查,都是用事务做)

    • 操作数据分4步
      c-1、开启事务
      c-2、获取事务中的objectStore
      c-3、通过objectStore发起操作请求
      c-4、定义请求的回调函数

1、首先是打开数据库

const opendbRequest = indexedDB.open("MyDatabase", version); 

上述的opendbRequest会有四个状态

  • sucess 打开成功
  • error 打开失败
  • upgradeneeded 首次打开或者数据库版本变化时会触发,先本事件,再是sucess等事件
  • blocked 上一次连接还没关闭
注意:并不是直接打开数据库,而是发起了一个打开数据库的请求!这里当verison比现存的db版本大,或者不存在当前db的时候,就会触发一个changeVersion的事件,会触发upgradeneeded回调。
let db;

opendbRequest.onsuccess = function(event) {

    // 请求的 success 回调里面就可以获取打开的数据库了:

    db = event.target.result; // 或 opendbRequest.result

};

打开完数据库,那就是对数据库的各种设置了

opendbRequest.onupgradeneeded = e=>{
    const db = e.target.result
    // 只有在这个回调里面,才能定义(增删改)对象仓库及对象仓库的规则!
    // 术语:对象仓库(objectStore) 相当于 MySQL中的表(table),mogodb中的repository(仓库)
    // 创建objectStore
    // 创建时 一定要注意定义好key的规范,key就相当于
    // MySQL里的主键,关于key的规范请百度查询
    const objectStore = DB.createObjectStore('myObjectStore', { keyPath: 'id' });
    // 创建索引:
    // 有联合索引,唯一索引,对数组字段建索引
    objectStore.createIndex('index_name', ['field1', 'field2', 'field3'], { unique: true })\
 }

设置完,才可以用事务,对数据库里的数据进行增删查改

// 创建事务:
// 第一个参数指明事务所涉及的objectStores,如果只有一个objectStore,[]可以省略,本例可以直接写 'myObjectStore'
// 第二参数指明事务操作数据的方式,如不写 默认是 readonly,表示只能读数据 不能写。如果不仅仅是读,还有增删改数据,必须用 readwrite。
// 请注意 readwrite 事务性能较低,并且只能有一个处于活动状态。所以除非必要,不要随意使用readwrite!
let transaction = db.transaction(['myObjectStore'],'readwrite')
// 获取事务中的objectStore (**注意:** objectStore只有事务才能获取,而不能通过db直接获取)
let objectStore = transaction.objectStore('myObjectStore')
// 在事务objectStore上发起操作数据的请求:(注意只有objectStore才能发起操作数据的请求!)
// add 新增, put 不存在相同key值的,是新增;存在,是修改,
// delete 删除,get 查询 这两个参数只能传入特定对象的 key!如:let request = objectStore.delete(myKey)
let request = objectStore.add(modifyData)
// 请求成功的回调
request.onsuccess = e => {
    console.log('添加数据成功。新数据的key是:',e.target.result)
}

如果不需要了,要删除数据库

var DBDeleteRequest = window.indexedDB.deleteDatabase('MyDatabase');

// 成功
DBDeleteRequest.onerror = function () {};
// 失败
DBDeleteRequest.onsuccess = function () {};

使用场景

  • threejs的3d模型,一般都较大,可以异步请求,先存储到本地

  • indexDB数据库,需要时再本地读取,速度比从服务端请求快得多。

  • 地图基础数据,特别是路段基础数据,动辄上w条数据,基本也
    得有10几m,甚至更多,也可以首次请求完存储到本地indexDB数据库。

  • 图片的大批量提交,blob数据也可以暂存于indexDB,避免重复
    获取,生产多余垃圾。

  • 离线应用,在有网络的情况下,保存服务端数据,以便离线时,
    应用能够正常使用。

  • 页面间共用的大数据,或者结构特别复杂的数据,此时可以选择
    用indexDB管理会简单些。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值