✨ JSON 配置仅存储用户差异并与最新默认配置合并#1538
Conversation
storage 中只保存 eslint_config / editor_config 与内置默认配置的稀疏差异, 读取时将差异合并到最新默认配置(用户值优先),使扩展升级带来的默认配置 更新能自动生效,同时完整保留用户改动。旧版全量存储的配置读取时自动兼容, 下次保存后自动收敛为稀疏差异。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Case Studies:JSON 配置只保存用户差异,并与最新默认配置合并1. PR 核心目的这个 PR 解决的是:当用户修改过 JSON 配置后,旧逻辑会把整份 JSON 写入 新的方案类似 VSCode 的“两层配置”模型: 也就是说: 写入时,系统会把用户提交的完整 JSON 与默认 JSON 做深度 diff,只把差异保存到 storage;读取时,再把 storage 中的差异合并到最新默认配置上,返回完整 JSON 给设置页、linter worker、Monaco 等调用方。 2. 本 PR 涉及的主要文件
3. 行为规则总览3.1 写入规则用户在设置页保存时,前端仍然可以提交“完整 JSON”。但进入 storage 前,系统会计算: 如果用户配置与默认配置完全一致: 此时会删除对应 storage key,而不是存一份空 JSON 或完整默认 JSON。PR 中 3.2 读取规则读取 storage 时,系统拿到的是用户差异配置: {
"rules": {
"no-debugger": ["warn"]
}
}然后与当前版本内置的最新默认配置合并: 最终返回给业务侧的仍然是完整 JSON,因此设置页、worker、Monaco 等上下文不需要改变使用方式。 3.3 合并规则
测试中覆盖了“嵌套对象合并”“数组整体替换”“覆盖配置独有 key 保留”“类型不同时使用覆盖值”等场景。 4. Case StudiesCase Study 1:用户没有修改过配置,始终使用最新默认值场景一个新用户安装 ScriptCat,或者一个老用户从未改过 旧行为可能的问题旧逻辑下,如果某次保存把完整默认 JSON 写进 storage,那么以后即使系统默认配置升级,用户也可能继续读到旧 storage 中的完整配置。 新行为如果用户配置与默认值完全一致,storage 不保存任何差异。 读取时: 价值用户没有表达过偏好时,系统默认配置可以持续演进。例如: {
"rules": {
"no-empty": ["error"],
"no-debugger": ["error"]
}
}以后 ScriptCat 新增默认规则: {
"rules": {
"no-empty": ["error"],
"no-debugger": ["error"],
"no-eval": ["warn"]
}
}用户会自动获得 对应测试
Case Study 2:用户只修改一条 ESLint 规则,storage 只保存这一条差异场景默认 ESLint 配置中: {
"rules": {
"no-debugger": ["error"],
"no-empty": ["error"]
}
}用户把 {
"rules": {
"no-debugger": ["warn"],
"no-empty": ["error"]
}
}新 storage 内容系统不会保存整份 JSON,而是只保存差异: {
"rules": {
"no-debugger": ["warn"]
}
}读取后的最终配置运行时合并后,业务侧拿到的是完整配置: {
"rules": {
"no-debugger": ["warn"],
"no-empty": ["error"]
}
}价值storage 只表达“用户真正改过什么”。这样系统之后更新其他默认规则时,不会被旧的完整 JSON 卡住。 对应测试PR 中的测试验证了保存 ESLint 配置时,只会存储 Case Study 3:用户新增自定义 ESLint 规则,新增 key 会被保留场景用户希望加入项目自定义规则: {
"rules": {
"no-debugger": ["warn"],
"custom/added-rule": ["error"]
}
}其中: 新 storage 内容{
"rules": {
"no-debugger": ["warn"],
"custom/added-rule": ["error"]
}
}为什么
|
Checklist / 检查清单
Description / 描述
实现 #1517 讨论中确定的方案(合并 = 用户 + 默认,有变动以用户配置为准,只保存用户改动),针对目前受影响的两个 JSON 配置项
eslint_config与editor_config:问题:用户改动过配置后,整份 JSON 被完整写入 storage。之后 ScriptCat 升级默认配置(新增 ESLint 规则、调整编辑器编译选项等)对这些用户永远不生效。
方案(VSCode 式两层配置,存储层编解码):
兼容性(已上架用户无感升级):
chrome.storage.sync单键 8KB 配额压力显著降低(全量 ESLint 配置数 KB → 通常几十字节的差异)。"off"。测试:新增
src/pkg/config/json_overrides.test.ts(合并/差异算法)与config.test.ts中「JSON 配置的稀疏存储与默认值合并」共 15 个用例(含旧版全量配置兼容场景),全部通过;pnpm test(3023 个用例)与pnpm run lint均通过。close #1517
🤖 Generated with Claude Code