/** * Electron Preload 脚本 * * 这是渲染进程和主进程之间的安全桥梁 * 通过 contextBridge 安全地暴露 API 给渲染进程 * * 安全说明: * - contextIsolation: true 确保渲染进程无法直接访问 Node.js API * - 所有暴露的方法都经过 IPC 通道与主进程通信 * - 不要在这里导入 electron-store 或其他 Node.js 模块 */ import { contextBridge, ipcRenderer } from 'electron' // IPC 通道名称(与 ipc.ts 保持一致) const IPC_CHANNELS = { SAVE_FILE: 'file:save', READ_FILE: 'file:read', GET_SETTINGS: 'settings:get', SAVE_SETTINGS: 'settings:save' } as const // API 响应类型定义 interface FileOperationResult { success: boolean message: string path?: string | null content?: string | null } interface SettingsOperationResult { success: boolean message?: string data?: unknown } // 暴露给渲染进程的 API 接口 interface ElectronAPI { // 文件操作 file: { save: (content: string, filename?: string) => Promise read: (filename?: string) => Promise } // 设置操作 settings: { get: (key?: string) => Promise save: (key: string, value: unknown) => Promise } } // 通过 contextBridge 安全地暴露 API const electronAPI: ElectronAPI = { // ============================================ // 文件操作 API // ============================================ file: { /** * 保存文件到桌面 * @param content - 文件内容 * @param filename - 文件名(可选,默认为 demo-note.txt) */ save: (content: string, filename?: string) => { return ipcRenderer.invoke(IPC_CHANNELS.SAVE_FILE, content, filename) }, /** * 从桌面读取文件 * @param filename - 文件名(可选,默认为 demo-note.txt) */ read: (filename?: string) => { return ipcRenderer.invoke(IPC_CHANNELS.READ_FILE, filename) } }, // ============================================ // 设置操作 API // ============================================ settings: { /** * 获取用户设置 * @param key - 设置键名(可选,不传返回所有设置) */ get: (key?: string) => { return ipcRenderer.invoke(IPC_CHANNELS.GET_SETTINGS, key) }, /** * 保存用户设置 * @param key - 设置键名 * @param value - 设置值 */ save: (key: string, value: unknown) => { return ipcRenderer.invoke(IPC_CHANNELS.SAVE_SETTINGS, key, value) } } } // 暴露 API 到 window.electronAPI contextBridge.exposeInMainWorld('electronAPI', electronAPI) // TypeScript 类型声明(供渲染进程使用) declare global { interface Window { electronAPI: ElectronAPI } }