16.1 目的
随着您的扩展程序不断演化,存储的数据也会随之变化。 本节展示了一个轻量级的迁移模式。
16.2 使用场景 / 避免场景
使用场景: 当您需要在版本间安全地更改存储设置而不会破坏现有安装时,请使用此方法。
避免场景: 当您需要一个完整的数据库或复杂的查询(考虑 IndexedDB 或服务器支持的存储)。
16.3 最小化迁移模式
存储一个模式版本:
javascript
const KEY = "settings";
const CURRENT = 2;
async function loadSettings() {
const out = await chrome.storage.local.get({ [KEY]: { version: 0 } });
let s = out[KEY];
if (!s || typeof s !== "object") s = { version: 0 };
// Forward-compat: if a newer version somehow exists, don't smash it.
if ((s.version ?? 0) > CURRENT) return s;
while ((s.version ?? 0) < CURRENT) {
const prev = s.version ?? 0;
s = migrateOnce(s);
if ((s.version ?? 0) <= prev) {
throw new Error("migration did not advance version");
}
}
await chrome.storage.local.set({ [KEY]: s });
return s;
}
function migrateOnce(s) {
if (s.version === 0) {
return { version: 1, enabled: true };
}
if (s.version === 1) {
// example: rename field
const { enabled } = s;
return { version: 2, isEnabled: enabled };
}
return s;
}
最小示例
一个最小的 MV3 安全异步消息处理程序(适合作为模板使用): CODE_BLOCK_67
16.4 雷区
-
不具备幂等性的单次迁移
-
没有版本字段的老安装被破坏
16.5 检查清单
-
\] 存储 version
-
\] 保持迁移小巧且可测试
-
storage: chrome.storage
-
runtime.onInstalled (迁移钩子) (官方): https://developer.chrome.com/docs/extensions/reference/api/runtime#event-onInstalled