简介
http://www.ruanyifeng.com/blog/2018/07/indexeddb.html
通俗地说,IndexedDB 就是浏览器提供的本地数据库,它可以被网页脚本创建和操作。IndexedDB 允许储存大量数据,提供查找接口,还能建立索引。这些都是 LocalStorage 所不具备的。就数据库类型而言,IndexedDB 不属于关系型数据库(不支持 SQL 查询语句),更接近 NoSQL 数据库。IndexedDB 具有以下特点。
(1)键值对储存。 IndexedDB 内部采用对象仓库(object store)存放数据。所有类型的数据都可以直接存入,包括 JavaScript 对象。对象仓库中,数据以”键值对”的形式保存,每一个数据记录都有对应的主键,主键是独一无二的,不能有重复,否则会抛出一个错误。
(2)异步。 IndexedDB 操作时不会锁死浏览器,用户依然可以进行其他操作,这与 LocalStorage 形成对比,后者的操作是同步的。异步设计是为了防止大量数据的读写,拖慢网页的表现。
(3)支持事务。 IndexedDB 支持事务(transaction),这意味着一系列操作步骤之中,只要有一步失败,整个事务就都取消,数据库回滚到事务发生之前的状态,不存在只改写一部分数据的情况。
(4)同源限制 IndexedDB 受到同源限制,每一个数据库对应创建它的域名。网页只能访问自身域名下的数据库,而不能访问跨域的数据库。
(5)储存空间大 IndexedDB 的储存空间比 LocalStorage 大得多,一般来说不少于 250MB,甚至没有上限。
(6)支持二进制储存。 IndexedDB 不仅可以储存字符串,还可以储存二进制数据(ArrayBuffer 对象和 Blob 对象)。
使用场景
需要稳定的大存储的时候可以选用该方案处理。
另外indexedDB的操作主要是异步的,避免阻塞应用程序,如果需要同步操作可以另行查看资料。
API
AP简单来说主要是创建数据库和增删改查等操作。
这里的数据库还有一个版本的概念,并且在更新版本时(大于数据库的版本时)会触发upgradeneeded
事件
你可以通过这个事件来监听异步操作的完成,来处理后续逻辑。
其他API可以直接看文档,这里就不直接搬运了。
- Firefox: https://developer.mozilla.org/zh-CN/docs/Web/API/IndexedDB_API
- chrome: https://developers.google.com/web/ilt/pwa/working-with-indexeddb
- 阮一峰: http://www.ruanyifeng.com/blog/2018/07/indexeddb.html
存储大小
这里每个浏览器的策略各有不同,总结来看具备以下共通特征
- 根据硬盘大小的百分比给浏览器的存储分配空间
- 超过目标存储大小会触发存储源的回收机制,这个机制各个浏览器也各有不同
- 都只支持同源存取
- 所有的源共用一套总大小(描述这一点是为了说明,理论上indexedDB是有可能比localStorage的5MB还小的)
关于存储的限制可以看一下资料:
- Firefox: https://developer.mozilla.org/zh-CN/docs/Web/API/IndexedDB_API/Browser_storage_limits_and_eviction_criteria
- Chrome: https://developer.chrome.com/apps/offline_storage#sharing-the%20pool
兼容性
其他
- 在DevTools中查看和调试IndexedDB:https://developers.google.com/web/tools/chrome-devtools/storage/indexeddb