第七部分 — 存储 数据建模与迁移提示

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

  • 使迁移幂等

  • 保持迁移小巧且可测试

16.6 参考资料

相关推荐
FRing03几秒前
JavaScript入门到精通二十四(正则表达式、元字符、修饰符)
开发语言·前端·javascript·正则表达式
用户094248568033 分钟前
第2章:Windows、WSL2 与 Docker 环境搭建Redis
java·jvm
西索斯coding6 分钟前
Grok 4.7 调用一直 401 怎么办?不是 Key 过期,是 Authorization 头格式问题——排查全流程 + 修复示例
服务器·开发语言·ai·php
小物学长13 分钟前
HJ212-2017 对接与环境在线监测平台设计:报文、CRC、应答、预警和传输有效率
java
171320330计算机毕设编程15 分钟前
计算机毕业设计 基于springboot+vue的在线观鸟视频播放网站 LW PPT
java·大数据·vue.js·spring boot·算法·课程设计
IT枫斗者枫哥16 分钟前
JDBC事务实测:操作日志写入失败时,让客户修改一起回滚
java
OxYGC19 分钟前
Spring 面经系列 · 第 1 篇:Bean 生命周期、单例语义、依赖注入与线程安全
java·安全·spring
小物学长31 分钟前
Java 程序员的 IoT 协议入门(一):物联网平台到底在做什么
java
const_qiu33 分钟前
第四章 07:4.7 本章小结
java·运维·服务器·人工智能