Back to Prompt Optimizer

Desktop IndexedDB问题修复任务总结

docs/archives/110-desktop-indexeddb-fix/README.md

2.10.24.3 KB
Original Source

Desktop IndexedDB问题修复任务总结

📋 任务概述

  • 任务类型:Bug修复 + 架构改进
  • 开始时间:2025-01-01
  • 完成时间:2025-01-01
  • 状态:✅ 已完成
  • 优先级:高(影响Desktop应用正常使用)

🎯 问题描述

用户在Desktop应用中发现,即使在Electron环境下,开发者工具中仍然可以看到IndexedDB数据库,这违反了Desktop应用的架构设计(应该只使用主进程的memory storage)。

🔍 问题分析

根本原因

  1. 模块级存储创建packages/core/src/services/prompt/factory.ts中有模块级别的StorageFactory.createDefault()调用
  2. TemplateLanguageService构造函数:使用默认参数调用createDefault()
  3. 历史遗留数据:之前创建的IndexedDB数据持久化存储在浏览器中

架构问题

  • 设计违反:Electron渲染进程不应该有任何本地存储实例
  • 数据不一致:渲染进程和主进程可能有不同的数据状态
  • 意外创建createDefault()方法在任何环境下都会创建IndexedDB

🛠️ 解决方案

核心修复

  1. 彻底删除StorageFactory.createDefault()方法
  2. 修复TemplateLanguageService构造函数:改为必须传入storage参数
  3. 重构prompt/factory.ts:移除模块级存储创建,改为依赖注入
  4. 修复API调用错误getModels()getAllModels()

架构改进

  • 强制明确性:所有存储创建都必须明确指定类型
  • 避免意外创建:防止在不合适环境下自动创建IndexedDB
  • 代理架构完善:Electron渲染进程完全使用代理服务

📁 修改的文件

Core包修改

  • packages/core/src/services/storage/factory.ts - 删除createDefault()和getCurrentDefault()
  • packages/core/src/services/template/languageService.ts - 构造函数改为必须传入storage
  • packages/core/src/services/prompt/factory.ts - 重构为依赖注入方式
  • packages/core/src/services/prompt/service.ts - 移除重复函数定义
  • packages/core/src/index.ts - 修复导出路径
  • packages/core/tests/integration/storage-implementations.test.ts - 更新测试

Desktop包修改

  • packages/desktop/package.json - 添加缺失依赖
  • packages/desktop/main.js - 修复API调用错误
  • packages/desktop/build.js - 创建跨平台构建脚本

UI包修改

  • packages/ui/src/composables/useAppInitializer.ts - 修复Electron存储代理

清理的过度修复

  • 移除DexieStorageProvider中的Electron环境警告
  • 简化useAppInitializer中的详细调试信息
  • 删除不必要的listTemplatesByTypeAsync方法

🧪 测试验证

测试结果

  • ✅ Desktop应用成功启动
  • ✅ 主进程正确使用memory storage
  • ✅ 渲染进程使用代理服务
  • ✅ 模板加载正常(7个模板)
  • ✅ Web开发服务器运行正常
  • ✅ 无IndexedDB自动创建

用户验证

  • ✅ 手动删除IndexedDB后,重新启动应用不再创建IndexedDB
  • ✅ 应用功能正常,界面加载正常

💡 关键收获

架构原则

  1. 强制明确性比便利性更重要:删除createDefault()强制开发者明确指定存储类型
  2. 避免模块级副作用:模块导入不应该产生存储创建等副作用
  3. 依赖注入优于默认值:明确的依赖传递比隐式的默认值更安全

调试经验

  1. 历史数据影响:修复代码后仍需清理历史遗留数据
  2. 环境检测时序:Electron环境检测需要考虑preload脚本执行时序
  3. 过度修复识别:修复过程中要避免不必要的复杂化

代码质量

  1. 及时清理无用代码:如getCurrentDefault()等失效方法
  2. 避免过度防御:如DexieStorageProvider中的环境警告
  3. 保持接口一致性:Web和Electron版本应尽可能使用相同接口

📚 相关文档

🔄 后续行动

  • 将此次修复经验整理到故障排查清单中
  • 考虑添加自动化测试防止类似问题再次发生
  • 评估是否需要在其他地方应用类似的架构改进

任务负责人:AI Assistant
审核状态:已归档 归档时间:2025-01-02