跳转到主要内容
Extension.js 不会替换或包装浏览器存储 API;它只编译你调用这些 API 的代码。但存储区域的选择仍然重要。它会影响 service worker 的可靠性、跨浏览器的一致性,以及未来的数据结构变化。

选择合适的存储区域

存储区域在何时使用备注
storage.local单设备上的持久扩展状态大多数扩展数据的最佳默认值
storage.sync在已登录浏览器之间同步的小型用户偏好受配额限制,速度比 local 慢
storage.session短暂的会话状态适合短暂的运行时协调
storage.managed企业管理的策略值由 schema 驱动,对扩展只读

推荐的默认设置

  • storage.local 存放功能状态、缓存以及持久设置。
  • 仅在小型、用户层面有意义的偏好上使用 storage.sync
  • storage.session 存放不应在完整浏览器重启后保留的状态。
  • storage.managed 当作一条独立的企业路径,而不是通用设置机制。

对 service worker 友好的模式

Manifest V3(MV3)的后台 service worker 可能在事件之间停止并重新启动,所以不要仅依赖内存状态。
  • 按需从存储中恢复关键状态。
  • 把内存缓存当作一种优化,而非依赖。
  • 保持启动开销小,让事件处理保持响应。
  • 持久化带版本的设置变更,而不是假设 background 脚本始终运行。

设置模块示例

const SETTINGS_KEY = "settings";

export async function getSettings() {
  const result = await chrome.storage.local.get(SETTINGS_KEY);
  return result[SETTINGS_KEY] ?? { theme: "system" };
}

export async function setSettings(nextSettings: {
  theme: "system" | "light" | "dark";
}) {
  await chrome.storage.local.set({ [SETTINGS_KEY]: nextSettings });
}

存储设计清单

  1. 决定哪些值必须在浏览器重启后仍然存在。
  2. 决定(如果有)哪些值应在设备间同步。
  3. 在首次发布前为存储的数据结构定义版本。
  4. 为被重命名的键或结构变更准备迁移路径。
  5. 不要在客户端可读的扩展存储中保存密钥,除非你完全接受任何扩展代码都能读取它们。

Managed 存储

如果你使用 storage.managed,请把运行时代码与 manifest.json 中合法的 storage.managed_schema 文件搭配使用。Extension.js 会校验并把该 schema 文件输出到对应路径。 关于 JSON 资源的详情,参见 JSON

常见错误

  • storage.sync 用于大型数据集或缓存。
  • 在 MV3 中假设 background 内存变量是持久的。
  • 在没有版本化策略的情况下存储多个互不关联的键。
  • 把企业管理的存储与用户可编辑的设置混在一起,而不区分它们的访问模式。

下一步

  • manifest.json 中声明由 schema 支撑的企业存储。
  • JSON 中回顾资源处理。
  • 消息通信 在上下文之间移动状态。