在通才 3D 数字工厂项目中,由于场景文件(glb 资源文件)过大,并且每次加载页面时,glb 文件都会被重新加载,造成页面加载缓慢,最后通过保存生成 Blob 格式存储到 IndexedDB 中,增加文件缓存,减少资源重复加载。
随着前端技术的发展和浏览器功能的不断增强,越来越多复杂的交互和业务需求需要前端来实现,其中一种常用的优化方式就是本地存储数据,减少从服务器获取数据,直接从本地获取数据也能提高页面渲染的速度。但先前的数据储存方案都不适合储存大量结构化数据,如 localStorage 容量通常在 10MB 以内(各家浏览器不同),储存的格式数据也有限,且不提供搜索功能,不能建立自定义的索引;因此需要一种新的解决方案,那就是 IndexedDB。
IndexedDB 就是浏览器提供的本地数据库,它提供了一些底层 API,用于在客户端存储大量的结构化数据(也包括文件/二进制大型对象),并提供查找接口,还能建立索引。
数据库事务(transaction)是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成。
判断当前浏览器是否支持 IndexedDB,可用如下代码:
window.indexedDB = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB
if (!window.indexedDB) {
alert('你的浏览器不支持IndexedDB')
}
打开数据库使用 indexedDB.open() 方法
const request = window.indexedDB.open(name, version)
const request = window.indexedDB.open('myIndexedDB')
// success 事件表示成功打开数据库
request.onsuccess = (event) => {
db = event.target.result
console.log('打开 IndexedDB 成功')
}
// error 事件表示打开数据库失败
request.onerror = (event) => {
console.log('打开 IndexedDB 失败')
}
// 如果指定的版本号,大于数据库的实际版本号,就会发生数据库升级事件 upgradeneeded request.onupgradeneeded = function (e) {