docs/archives/112-desktop-ipc-fixes/ipc-architecture-analysis.md
在Desktop版本开发中遇到的IPC架构问题分析和解决经验。
Web环境(单进程):
Vue组件 → 直接调用 → 服务实例
Desktop环境(多进程):
Vue组件 → ElectronProxy → IPC → Main进程 → 服务实例
// ❌ 接口定义不完整
interface ITemplateManager {
getTemplate(id: string): Promise<Template>;
// 缺少语言相关方法
}
// ✅ 完整的接口定义
interface ITemplateManager {
getTemplate(id: string): Promise<Template>;
getCurrentBuiltinTemplateLanguage(): Promise<BuiltinTemplateLanguage>;
changeBuiltinTemplateLanguage(language: BuiltinTemplateLanguage): Promise<void>;
}
// ❌ 代理类缺少方法
class ElectronTemplateManagerProxy implements ITemplateManager {
async getTemplate(id: string): Promise<Template> {
return this.electronAPI.getTemplate(id);
}
// 缺少其他方法的实现
}
// ✅ 完整的代理实现
class ElectronTemplateManagerProxy implements ITemplateManager {
async getTemplate(id: string): Promise<Template> {
return this.electronAPI.getTemplate(id);
}
async getCurrentBuiltinTemplateLanguage(): Promise<BuiltinTemplateLanguage> {
return this.electronAPI.getCurrentBuiltinTemplateLanguage();
}
}
// preload.js - 缺少方法暴露
window.electronAPI = {
template: {
getTemplate: (id) => ipcRenderer.invoke('template-getTemplate', id),
// 缺少语言相关方法
}
}
// main.js - 缺少处理器
ipcMain.handle('template-getTemplate', async (event, id) => {
// 处理逻辑
});
// 缺少语言相关处理器
// 步骤1:定义完整接口
export interface ITemplateManager {
// 所有需要的方法
}
// 步骤2:Web环境实现
export class TemplateManager implements ITemplateManager {
// 完整实现
}
// 步骤3:Electron代理实现
export class ElectronTemplateManagerProxy implements ITemplateManager {
// 完整代理实现
}
Vue组件调用 → 检查代理方法 → 检查preload暴露 → 检查main处理器 → 检查服务方法
// ❌ 错误掩盖
async someMethod() {
try {
return await this.service.method();
} catch (error) {
return null; // 掩盖了错误
}
}
// ✅ 错误传播
async someMethod() {
return await this.service.method(); // 让错误自然传播
}
// 在每个环节添加日志
console.log('[Vue] Calling method:', methodName);
console.log('[Proxy] Forwarding to IPC:', methodName);
console.log('[Main] Handling IPC:', methodName);
console.log('[Service] Executing:', methodName);
// 使用严格的类型检查
interface ElectronAPI {
template: {
[K in keyof ITemplateManager]: ITemplateManager[K];
};
}
这些架构分析为后续的开发提供了基础:
这些经验在后续的序列化优化(115)中得到了进一步应用。