优化实战 第 65 期 - 使用 IndexDB 缓存庞大数据体

864 阅读2分钟

随着前端技术发展的强大,越来越复杂的交互和业务都可以由前端来实现,那么前端就需要面对越来越庞大的数据体。对于这些不变的庞大数据体,就需要通过 IndexDB 来进行存储,从而提升页面渲染速度,减轻服务器端压力

IndexDB的特点

  • 非关系型数据库

    关系型数据库的主要特点是数据以一张二维表的形式存储,而 IndexDB 是非关系型数据库,主要以键值对的形式存储数据

  • 持久化存储

    当清除浏览器缓存后,像 Cookie、localStorage、sessionStorage 等方式存储的数据都会被清除掉,而使用 IndexDB 存储的数据则不会被清掉,除非手动删除该数据库

  • 异步调用

    IndexDB 的相关操作是异步调用的,当存储庞大的数据时,不会因为读写数据慢而导致页面阻塞

  • 同源限制

    受同源策略限制,只能访问自身域名下的数据库,不能进行跨域访问

  • 支持事务

    能够确保多个操作只要其中一步出现问题,整个事务就会取消,数据库回滚到事务发生之前的状态,确保数据的一致性

  • 存储空间大

    提供不少于 250MB 的存储空间,可以存储大量的结构化数据(包括文件/二进制大型对象blobs)

IndexDB包装库(Dexie.js

  • 概览

    由于原生 IndexDBAPI 对开发者来说不够友好,所以我们选用其包装库 Dexie.js 在项目中使用 IndexDB

  • 创建或获取数据库实例

    const db = new Dexie(DBName)
    

    如果当前传入的数据库已经存在,则返回已经存在的数据库示例,否则将会新建一个数据库,并返回该数据库的实例

  • 定义数据库结构

    db.version(0.1).stores({
      layerData: 'datasetId'
    })
    

    为了兼容 IE 的一个 BUG,所以在实际建库的时候版本号都会乘以 10,当前设置的是 0.1,则实际建库的版本就是 1

    layerData 是定义的存储键,其对应的值是定义的字段索引,通过索引可以实现对数据的高性能搜索

  • 定义字段的四种索引

    索引说明
    主键索引列表的第一个字段会被当做主键,如果主键前有 ++ 符号,说明这个字段是自增的
    唯一索引如果某个索引字段的值在所有记录中是唯一的,可以在字段前面添加 & 号,表示唯一索引
    多值索引如果某个字段具有多个值,可以在字段前面加 * 号将其设置为多值索引
    复合索引如果某个索引是基于多个字段的,就可以将其设置为复杂索引,格式为 [A+B]
  • 参阅文档

    dexie.org/docs/API-Re…