javascript - Chrome 扩展开发:chrome.storage.local vs Indexeddb
问题描述
我目前正在开发一个数字钱包应用程序作为 chrome 扩展,并试图找出我应该使用什么作为我的持久存储层:chrome.storage.local或indexedDb。我研究过其他类似的开源项目,似乎大多数使用前者而不是后者。
我想了解使用其中一个是否有任何优势。目前,我倾向于使用chrome.storage.local的原因是:
- 在官方 chrome 扩展文档中建议作为存储 API
- 它在应用程序重新启动时是持久的。(Indexeddb 似乎也是,但我没有发现它在任何文档中被明确提及为持久存储,所以我不确定)
- 两者都是异步的
- 简单的 API(与 indexeddb 不同)
我知道我的用例和数据形状可能是一个重要因素:就我的应用而言
- 我正在存储简单的 JSON 类型(字符串、数字、布尔值、对象、数组)
- 对象数组可以任意增长,例如存储地址列表或交易历史。(这确实是让我认为 IndexedDb 是否会提供任何优势的主要原因)
基于上述情况,是否有任何理由可以比另一个更好地为我的应用程序提供服务?还有什么我应该考虑的吗?提前致谢!
解决方案
在 Chrome 和 Firefox 中,扩展使用的 IndexedDB 是持久的。在 Chrome 中,即使不添加也是无限的"unlimitedStorage"
,"permissions"
因此它使用全局配额管理,请参阅crbug.com/1209236。我已经导入了一个 40MB 的虚拟 JSON(15MB 压缩)并且它工作正常。Safari WebExtensions 规范可能不那么慷慨。
使用 IndexedDB 的原因:
- 结构化克隆算法(Map、Set、Date、RegExp、Blob、File、FileList、ArrayBuffer、ImageBitmap、ImageData 和最近的 BigInt、Error)支持的非字符串键和值以及由提供的基本 JSON 兼容类型和(字符串、数字、布尔值、null 和递归地由这些普通类型组成的数组/对象)。
chrome.storage.local
.sync
- 存储和读取大的或深度嵌套的对象可能会快 10 倍甚至更多。
- 在不读取其值的情况下检查键是否存在。
- 只读取键的名称而不读取它们的值。
- 通过几个键索引。
object store
为每个可能不可预测地增长或缩小的阵列分配一个完整的(或许多)阵列。这将比读取整个数组、修改它并写回chrome.storage
.
扩展的 IndexedDB 不能直接在内容脚本中使用,只能通过变通方法:
消息传递。在 Chrome ManifestV2 中,它仅限于与 JSON 兼容的类型,因此要传输复杂类型,您必须对它们进行字符串化(缓慢)或将数据通过
new Response
转换为 aBlob
,将其提供给 URL.createObjectURL,发送结果 URL,在确认后撤销它收据。Chrome 的 ManifestV3 将很快支持消息的结构化克隆算法,但它们的实现仍会在内部对克隆数据进行字符串化,因此在修复之前处理大量数据肯定会很慢。Firefox 不受此限制,AFAIK。
网页中的 iframe
src
指向通过web_accessible_resources
其 manifest.json 公开的扩展的 html 页面。这个 iframe(在 Chrome 中)在扩展进程中运行,因此它可以直接访问其存储,并且可以使用支持结构化克隆算法的 parent.postMessage 来发送结果。为了避免被页面拦截,您应该在document_start处运行内容脚本,以在页面执行之前以捕获模式附加侦听器并防止其侦听器看到事件:// this script must be declared with "run-at": "document_start" const extensionOrigin = chrome.runtime.getURL('').slice(0, -1); window.addEventListener('message', e => { if (e.origin === extensionOrigin) { e.stopImmediatePropagation(); // hide from the page console.log(e); // process the event } }, true); // register in the first phase, "capture"
虽然还不够!站点可以在扩展之前安装侦听器,因为 WebExtensions 实现中存在一个基础安全漏洞(在 Chrome 和 Firefox 中观察到),该漏洞允许页面修改新创建的同源 iframe 或选项卡/窗口的环境,请参阅crbug。 com/1261964,因此对于敏感扩展,您必须实施非常复杂的解决方法,直到修补此漏洞。希望 ManifestV3 将提供安全的 postMessage,仅限于内容脚本的“孤立世界”。
推荐阅读
- amazon-web-services - s3 默认自动缩放吗?
- sorting - 如何在 Elasticsearch 中对不同字段的脚本排序进行排序有不同的类型?
- pandas - 我想将第 0 行的内容写为列名。我应该怎么办?(熊猫列问题)
- c - 将十进制定点/浮点格式打印为十六进制
- php - 我在使用 php 获取特定日期函数时遇到问题
- javascript - 使用特殊字符 javaScript 对数组进行排序
- javascript - 如何使用 ajax 和 php 从数据库中获取消息
- python - Python中的可变和不可变对象
- gcloud - 将文件写入 gcloud 存储桶应该很慢吗?
- xaml - 在 Xamarin 表单中同时显示选项卡栏和工具栏