15.1 目的
服务工作者(SW)可能在空闲时被关闭。 持久化状态必须存于全局变量之外。
chrome.storage 是默认的持久化存储。
15.2 使用场景 / 应避免使用场景
使用场景: 设置、小型状态、标志、缓存元数据。
应避免使用场景: 大型二进制对象(请使用 IndexedDB 或外部存储)。
15.3 最小示例
权限:
- storage
服务工作者(SW): CODE_BLOCK_64
15.4 本地 vs 同步 vs 会话
-
local: 最大/最快,每个设备独立
-
sync: 用户同步的,配额和写入速率受限
-
session: 在扩展加载期间内存中(重启软件保护程序后保留;在扩展重新加载/更新/禁用或浏览器重启时清除)
最小示例
一个最小的 MV3 安全异步消息处理程序(适合作为模板):
javascript
chrome.runtime.onMessage.addListener((msg, sender, sendResponse) => {
(async () => {
if (msg?.type !== "PING") return;
sendResponse({ ok: true });
})().catch((err) => sendResponse({ ok: false, error: String(err) }));
return true; // keep channel open for async
});
15.5 常见问题
-
将 sync 视作数据库(配额错误和写入速率限制)
-
忘记在 .get({defaults}) 中设置默认值
-
认为"体积小"而忽略检查文档中的配额(每个键的项数和总字节数会因区域不同而异)
-
写入过于频繁(采用防抖技术 + 批量写入;特别是在 sync 情况下)
-
假设 storage.session 对内容脚本默认可用 (它并不总是可用;如果必须使用,请调用 setAccessLevel())
15.6 检查清单
-
\] 选择合适的存储区域(本地/同步/会话)
-
\] 处理配额错误(尤其是同步情况)
-
storage: chrome.storage