iOS Safari下Dexie.js多数据库实例问题及跨浏览器IndexedDB封装库求荐
首先得纠正下你对Dexie.js的推测——正常情况下Dexie不会在每次写入事务时新建数据库实例,这种问题更可能是你的代码里重复创建了Dexie实例(比如在每次写入函数里都执行new Dexie('dbName')),而不是库本身的行为。建议先检查代码,把Dexie实例做成单例(全局只初始化一次),再测试看看是否还会出现多实例的问题。
如果确实需要更换更适配iOS Safari的IndexedDB封装库,这里有几个靠谱的选择:
LocalForage
这是最常用的轻量级封装库之一,它会自动根据浏览器环境选择最优存储方案(优先IndexedDB,降级到WebSQL、localStorage),对iOS Safari的兼容性做了充分优化,API非常简洁且基于Promise,适合简单的键值对存储场景,几乎不需要关心底层细节,上手成本极低。idb
由Chrome团队维护的轻量库,它只是把原生IndexedDB的回调式API封装成了Promise风格,几乎没有额外抽象,保留了原生IndexedDB的所有功能,同时修复了不少浏览器(包括iOS Safari)的兼容性bug。如果你需要用到IndexedDB的高级特性(比如索引、事务),又不想写原生的繁琐代码,这个库非常合适。PouchDB
如果你需要离线数据同步功能,PouchDB是绝佳选择。它完全兼容iOS Safari,支持和CouchDB服务器双向同步,同时也提供了类似IndexedDB的本地存储API。不过它的功能相对重一些,如果只是简单的本地存储场景,可能有点大材小用。
最后再提个关键注意点:不管用哪个库,一定要确保数据库实例是单例的——不要在每次操作时都新建连接,iOS Safari对IndexedDB的连接数有隐性限制,多实例容易导致各种异常行为。
内容的提问来源于stack exchange,提问作者Marvin Danig

