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

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 检查清单

相关推荐
一叶落4382 小时前
LeetCode 149. 直线上最多的点数(C语言详解 | 斜率 + 最大共线点)
数据结构·c++·算法·leetcode
仰泳的熊猫2 小时前
题目2267:蓝桥杯2016年第七届真题-取球博弈
数据结构·c++·算法·蓝桥杯·深度优先·图论
大志学java2 小时前
idea中切换分支后,项目目录不显示的问题
java·elasticsearch·intellij-idea
大尚来也2 小时前
超越“传参”:HTTP GET与POST的深度辨析与场景选型指南
开发语言
大鹏说大话2 小时前
破局与重构:微服务架构的演进之路、核心挑战与基石组件
开发语言
程序员敲代码吗2 小时前
进程与线程:操作系统中的核心组件
java·开发语言
Java面试题总结2 小时前
java面试题及答案(基础题122道)
java·开发语言·jvm·spring·spring cloud·golang·java-ee
Genevieve_xiao2 小时前
【差分】差分的理解与基础题型总结
数据结构·c++·算法
jacsonchen2 小时前
【MySQL】环境变量配置
java