docs/archives/103-desktop-architecture/refactor-plan.md
本文档记录了桌面应用从当前脆弱的"底层fetch代理"架构迁移到稳定、可维护的"高层服务代理"架构的完整重构计划。
localStorage,导致 StorageError: 获取存储项失败fetch API 进行 IPC 通信,AbortSignal 和 Headers 对象序列化问题频发TypeError: createModelManager is not a function 表明 CommonJS 导入解析失败@prompt-optimizer/core 核心服务,使用 Node.js 兼容的存储方案fetch 代理core 包)MemoryStorageProvider ✅packages/core/src/services/storage/memoryStorageProvider.ts (已完成)IStorageProvider 接口 ✅Map 对象模拟内存存储 ✅packages/core/src/services/storage/factory.ts ✅StorageFactory.create() 中添加 'memory' 选项 ✅packages/core/src/index.ts ✅MemoryStorageProvider 类 ✅packages/core/src/services/storage/factory.ts ✅StorageFactory.create() 中添加 'memory' 选项 ✅packages/core/src/index.ts ✅MemoryStorageProvider 类 ✅packages/desktop/main.jsipcMain.handle('api-fetch', ...) 处理器Response 对象的辅助代码AbortSignal 和 Headers 处理逻辑StorageFactory.create('memory') 创建存储实例ModelManager, TemplateManager, etc.)packages/desktop/main.js// 模型管理
ipcMain.handle('models:getAllModels', () => modelManager.getAllModels());
ipcMain.handle('models:saveModel', (e, model) => modelManager.saveModel(model));
ipcMain.handle('models:deleteModel', (e, key) => modelManager.deleteModel(key));
ipcMain.handle('models:enableModel', (e, key) => modelManager.enableModel(key));
ipcMain.handle('models:disableModel', (e, key) => modelManager.disableModel(key));
// 模板管理
ipcMain.handle('templates:getAllTemplates', () => templateManager.getAllTemplates());
ipcMain.handle('templates:saveTemplate', (e, template) => templateManager.saveTemplate(template));
ipcMain.handle('templates:deleteTemplate', (e, id) => templateManager.deleteTemplate(id));
// 历史记录
ipcMain.handle('history:getHistory', () => historyManager.getHistory());
ipcMain.handle('history:addHistory', (e, entry) => historyManager.addHistory(entry));
ipcMain.handle('history:clearHistory', () => historyManager.clearHistory());
// LLM 服务
ipcMain.handle('llm:testConnection', (e, modelKey) => llmService.testConnection(modelKey));
ipcMain.handle('llm:sendMessage', (e, params) => llmService.sendMessage(params));
// 提示词服务
ipcMain.handle('prompt:optimize', (e, params) => promptService.optimize(params));
ipcMain.handle('prompt:iterate', (e, params) => promptService.iterate(params));
packages/desktop/preload.jsfetch 拦截和模拟逻辑electronAPI 对象contextBridge.exposeInMainWorld('electronAPI', {
models: {
getAllModels: () => ipcRenderer.invoke('models:getAllModels'),
saveModel: (model) => ipcRenderer.invoke('models:saveModel', model),
// ...
},
templates: {
getAllTemplates: () => ipcRenderer.invoke('templates:getAllTemplates'),
// ...
},
// ...
});
packages/core/src/services/model/electron-proxy.tspackages/core/src/services/template/electron-proxy.tspackages/core/src/services/history/electron-proxy.tspackages/core/src/services/prompt/electron-proxy.tswindow.electronAPIpackages/ui/src/composables/useAppInitializer.tsuseAppInitializer 会自动检测运行环境。
if (isRunningInElectron()) { // Electron 环境
// 初始化所有代理服务...
} else { // Web 环境
// 初始化所有真实服务...
}
AbortSignal 或 Headers 序列化问题main.js 和 preload.js 的备份MemoryStorageProvider 替换为基于文件的存储(如 electron-store)状态: 📋 计划制定完成,等待执行 负责人: AI Assistant 预计完成时间: 分阶段执行,每阶段约1-2小时
✅ 创建 MemoryStorageProvider
IStorageProvider 接口✅ 集成新的存储提供者
StorageFactory 中添加 'memory' 选项core 包导出✅ 创建工厂函数
createModelManager() 工厂函数createTemplateManager() 工厂函数createHistoryManager() 工厂函数✅ 接口完善与代理适配
ITemplateManager 接口中添加 isInitialized() 方法ElectronTemplateManagerProxy 类中实现 isInitialized() 方法✅ 重构 main.js
MemoryStorageProvider 替代 LocalStorageProvider✅ 更新 preload.js
electronAPI 接口✅ 创建代理类
ElectronLLMProxy 适配 IPC 接口ElectronModelManagerProxy 实现模型管理桌面应用成功启动! 从最新的测试结果显示:
MemoryStorageProvider| 方面 | 旧架构(底层 fetch 代理) | 新架构(高层服务代理) |
|---|---|---|
| 稳定性 | ❌ 脆弱,IPC 传输问题频发 | ✅ 稳定,高层接口通信 |
| 可维护性 | ❌ 复杂的 Response 模拟 | ✅ 清晰的职责分离 |
| 存储兼容性 | ❌ Node.js 环境不支持 localStorage | ✅ 专用的 MemoryStorageProvider |
| 代码复用 | ❌ 重复的代理逻辑 | ✅ 主进程直接消费 core 包 |
| 类型安全 | ❌ 复杂的类型适配 | ✅ 完整的 TypeScript 支持 |
架构结论: 本次重构已圆满完成。随着统一初始化器 useAppInitializer 的引入和应用,桌面端的"高层服务代理"架构已完全落地,实现了各平台间架构的统一和代码的高度复用。
最后更新: 2024年12月29日