docs/archives/111-electron-preference-architecture/implementation.md
┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
│ UI Components │ │ PreferenceService │ │ Storage Layer │
│ │ │ │ │ │
│ - TemplateManager│───▶│ - IPreferenceService│───▶│ - Web: useStorage│
│ - ThemeToggle │ │ - ElectronProxy │ │ - Electron: IPC │
│ - LanguageSwitch│ │ - usePreferences │ │ - Main: fs │
└─────────────────┘ └──────────────────┘ └─────────────────┘
interface IPreferenceService {
get<T>(key: string, defaultValue: T): Promise<T>;
set<T>(key: string, value: T): Promise<void>;
delete(key: string): Promise<void>;
keys(): Promise<string[]>;
clear(): Promise<void>;
}
// 检测Electron API完整可用性
export function isElectronApiReady(): boolean {
const window_any = window as any;
const hasElectronAPI = typeof window_any.electronAPI !== 'undefined';
const hasPreferenceApi = hasElectronAPI &&
typeof window_any.electronAPI.preference !== 'undefined';
return hasElectronAPI && hasPreferenceApi;
}
// 异步等待API就绪
export function waitForElectronApi(timeout = 5000): Promise<boolean> {
return new Promise((resolve) => {
if (isElectronApiReady()) {
resolve(true);
return;
}
const startTime = Date.now();
const checkInterval = setInterval(() => {
if (isElectronApiReady()) {
clearInterval(checkInterval);
resolve(true);
} else if (Date.now() - startTime > timeout) {
clearInterval(checkInterval);
resolve(false);
}
}, 50);
});
}
错误信息: Cannot read properties of undefined (reading 'preference')
根本原因:
解决方案:
错误现象: hasApi: false, hasPreferenceApi: false
根本原因:
window.electronAPI.preferencewindow.api.preference解决方案: 统一API路径为window.electronAPI.preference
文件: packages/core/src/utils/environment.ts
修改内容:
isElectronApiReady()函数waitForElectronApi()函数文件: packages/ui/src/composables/useAppInitializer.ts
修改内容:
if (isRunningInElectron()) {
console.log('[AppInitializer] 检测到Electron环境,等待API就绪...');
// 等待 Electron API 完全就绪
const apiReady = await waitForElectronApi();
if (!apiReady) {
throw new Error('Electron API 初始化超时,请检查preload脚本是否正确加载');
}
console.log('[AppInitializer] Electron API 就绪,初始化代理服务...');
// ... 继续初始化
}
文件: packages/core/src/services/preference/electron-proxy.ts
修改内容:
export class ElectronPreferenceServiceProxy implements IPreferenceService {
private ensureApiAvailable() {
const windowAny = window as any;
if (!windowAny?.electronAPI?.preference) {
throw new Error('Electron API not available. Please ensure preload script is loaded and window.electronAPI.preference is accessible.');
}
}
async get<T>(key: string, defaultValue: T): Promise<T> {
this.ensureApiAvailable();
return window.electronAPI.preference.get(key, defaultValue);
}
// ... 其他方法
}
文件:
packages/core/src/index.tspackages/ui/src/index.ts修改内容: 导出新的环境检测函数
# 构建core包
cd packages/core && pnpm run build
# 构建ui包
cd packages/ui && pnpm run build
# 运行测试
pnpm run test
[isRunningInElectron] Verdict: true (via electronAPI)
[isElectronApiReady] API readiness check: {hasElectronAPI: true, hasPreferenceApi: true}
[waitForElectronApi] API already ready
[AppInitializer] Electron API 就绪,初始化代理服务...
[AppInitializer] 所有服务初始化完成
packages/core/src/utils/environment.ts - 环境检测增强packages/ui/src/composables/useAppInitializer.ts - 初始化优化packages/core/src/services/preference/electron-proxy.ts - 代理服务保护packages/core/src/index.ts - 导出更新packages/ui/src/index.ts - 导出更新packages/desktop/preload.js - API暴露配置packages/desktop/main.js - 主进程IPC处理实施完成日期: 2025-01-01
验证状态: ✅ 完全通过