我目前正在开发一个数字钱包应用程序作为chrome扩展,并试图弄清楚我应该使用什么作为我的持久存储层:chrome.storage.local或indexedDb。我研究过其他类似的开源项目,似乎大多数使用前者而不是后者。
我想知道使用其中一个是否比另一个有优势。目前,我倾向于使用chrome.storage.local的原因是:
- 在官方chrome扩展文档中建议将其作为存储API
- 它在应用程序重新启动时是持久的(Indexeddb也是,但我没有发现任何文档中明确提到它是持久存储,所以我不确定)
- 两者都是异步的
- 简单明了的API(与indexeddb不同)
我知道我的用例和数据形状可能是一个重要因素:就我的应用程序而言
- 我正在存储简单的JSON类型(字符串、数字、布尔值、对象、数组)
- 对象数组可以任意增长,例如存储地址列表或事务历史(这确实是让我思考IndexedDb是否会提供任何优势的主要原因)
基于以上所述,是否有任何理由认为其中一个会比另一个更适合我的申请?还有什么我应该考虑的吗?提前感谢!
1条答案
按热度按时间5us2dqdw1#
在Chrome和Firefox中,扩展使用的IndexedDB是持久的。在Chrome中,即使没有添加
"unlimitedStorage"
到"permissions"
,它也是无限的,所以它使用全局配额管理,请参见crbug.com/1209236。我导入了一个虚拟的40 MB JSON(压缩15 MB),它工作正常。Safari WebExtensions规范可能没有那么慷慨。使用IndexedDB的原因:
chrome.storage.local
和.sync
提供的基本JSON兼容类型(字符串、数字、布尔值、空值以及递归地由这些平凡类型组成的数组/对象)。1.存储和阅读大的或深嵌套的对象可以轻松地快10倍甚至更多。
1.检查键的存在而不阅读其值。
1.只阅读键的名称而不读取它们的值。
1.用几个关键字编索引。
1.为每个不可预测的增长或收缩的数组指定一个完整的
object store
(或多个),这将比阅读整个数组、修改它并写回chrome.storage
中的单个键快很多倍(如果数组很大,甚至可能快1000倍)。扩展的IndexedDB不能直接在内容脚本中使用,只能通过解决方法:
new Response
将数据转换为Blob
,将其馈送到URL.createObjectURL,发送结果URL,确认收到后撤销。Chrome'的ManifestV 3将支持消息soon的结构化克隆算法,但它们的实现仍然在内部限制克隆数据,因此在修复之前,处理大量数据肯定会很慢。Firefox不受此限制,AFAIK。
src
指向通过web_accessible_resources
在其manifest.json中公开的扩展的html页面。(在Chrome中)在扩展进程中运行,因此可以直接访问其存储,并且可以使用parent.postMessage,后者支持结构化克隆算法,发送结果。为了避免被页面拦截,您应该在document_start运行内容脚本,以便在页面之前以捕获模式附加侦听器,并防止其侦听器看到事件:但是这还不够!站点可以在扩展安装之前安装监听器,因为WebExtensions实现中存在一个基础安全漏洞(在Chrome和Firefox中观察到),允许页面修改新创建的同源iframe或tab/window的环境,请参见crbug.com/1261964,因此对于敏感扩展,您必须实现非常复杂的变通方案,直到这个漏洞被修补。ManifestV 3将提供一个安全的postMessage,该postMessage仅限于内容脚本的“隔离世界”。