为了更全面地覆盖常用 API,以下表格补充了更多实用方法和场景化示例,同时保持格式清晰易读。
一、主进程模块
模块名 | 核心用途 | 关键用法 + 示例 | 注意事项 |
---|---|---|---|
app | 应用生命周期管理 | • 退出应用:app.quit() • 重启应用:app.relaunch() 后需 app.quit() • 获取版本信息:app.getVersion() • 检查是否打包:app.isPackaged • 跨平台退出逻辑: app.on('window-all-closed', () => { if (process.platform !== 'darwin') app.quit()}) |
• 重启应用需先调用 relaunch() 再 quit() • isPackaged 可区分开发/生产环境 • macOS 下窗口全关后应保留应用实例 |
BrowserWindow | 窗口管理 | • 置顶窗口:win.setAlwaysOnTop(true) • 全屏切换:win.setFullScreen(!win.isFullScreen()) • 隐藏/显示:win.hide() / win.show() • 设置标题:win.setTitle('新标题') • 获取所有窗口:BrowserWindow.getAllWindows() |
• 全屏时建议提供退出按钮 • 频繁显隐比创建销毁更高效 • 多窗口应用注意内存泄漏 |
ipcMain | 主进程通信 | • 一次性监听:ipcMain.once('channel', callback) • 发送消息给所有窗口: BrowserWindow.getAllWindows().forEach(w => w.webContents.send('msg', data)) • 异步处理:ipcMain.handle('task', asyncHandler) |
• once 适合初始化类消息 • 广播消息注意过滤已关闭窗口 • handle 支持返回 Promise |
Menu | 应用菜单管理 | • 创建菜单: const menu = Menu.buildFromTemplate([ { label: '文件', submenu: [ { label: '退出', click: () => app.quit() } ]}])Menu.setApplicationMenu(menu) • 上下文菜单: win.webContents.on('context-menu', () => menu.popup()) |
• macOS 应用菜单第一项是应用名称 • 上下文菜单需监听右键事件 • 动态更新菜单使用 menu.items[index].visible = false |
Tray | 系统托盘图标 | • 创建托盘: const tray = new Tray('icon.png')<br>tray.setToolTip('我的应用')<br>tray.setContextMenu(menu) • 点击显示窗口:tray.on('click', () => win.show()) |
• 图标路径需绝对路径 • macOS 托盘点击行为与 Windows 不同 • Linux 需安装额外依赖 |
dialog | 系统对话框 | • 错误提示:dialog.showErrorBox('错误', '文件读取失败') • 多选文件: dialog.showOpenDialog({ properties: ['openFile', 'multiSelections']}) • 保存文件:dialog.showSaveDialog() |
• showErrorBox 无需异步处理 • 大文件选择可设置过滤器 • 保存对话框可预设文件名 |
session | 会话管理 | • 清除缓存: session.defaultSession.clearStorageData({ type: 'cache'}) • 拦截请求: session.defaultSession.webRequest.onBeforeRequest( filter, callback) |
• 清除数据是异步操作 • 请求拦截需在页面加载前设置 • 可用于实现离线模式或广告拦截 |
二、渲染进程模块
模块名 | 核心用途 | 关键用法 + 示例 | 注意事项 |
---|---|---|---|
ipcRenderer | 渲染进程通信 | • 发送同步消息(不推荐): const result = ipcRenderer.sendSync('sync-channel', data) • 移除所有监听:ipcRenderer.removeAllListeners('channel') • 异步调用:ipcRenderer.invoke('async-task') |
• 同步消息会阻塞UI,谨慎使用 • 组件卸载时务必移除监听 • invoke 配合 ipcMain.handle 使用 |
webFrame | 页面渲染控制 | • 缩放页面:webFrame.setZoomFactor(1.2) • 插入CSS: webFrame.insertCSS('body { background: #f0f0f0; }') • 设置文本缩放:webFrame.setTextZoomFactor(150) |
• 仅在渲染进程可用 • 缩放会影响所有内容 • 可用于实现阅读模式 |
Notification | 系统通知 | • 带图标和点击事件: new Notification({ title: '提醒', body: '有新消息', icon: 'notification.png'}).onclick = () => window.focus() |
• 部分系统会限制频繁通知 • 图标尺寸建议 128x128 • 需用户授权才能显示 |
clipboard | 剪贴板操作 | • 复制HTML:clipboard.writeHTML('<b>加粗文本</b>') • 读取RTF:clipboard.readRTF() • 复制富文本:clipboard.write({ text, html }) |
• 复杂格式复制在不同系统表现可能不同 • 大内容复制可能影响性能 • 安全考虑,部分敏感操作需确认 |
三、通用模块
模块名 | 核心用途 | 关键用法 + 示例 | 注意事项 |
---|---|---|---|
shell | 系统交互 | • 移动文件到回收站: shell.trashItem('/path/to/file') • 打开外部链接:shell.openExternal('https://github.com') • 显示在文件管理器中:shell.showItemInFolder('/path/to/file') |
• 回收站操作不可恢复 • 目录路径必须存在 • openExternal 有安全风险,需验证URL |
nativeImage | 图像处理 | • 从Base64创建: nativeImage.createFromDataURL(base64Str) • 保存为文件: fs.writeFileSync('out.png', image.toPNG()) • 调整大小:image.resize({ width: 64 }) |
• 大图片处理可能占用较多内存 • 支持格式:PNG, JPEG, ICO, ICNS • 可用于生成托盘图标或缩略图 |
screen | 屏幕信息 | • 获取主屏幕尺寸: screen.getPrimaryDisplay().workAreaSize • 所有屏幕信息:screen.getAllDisplays() • 监听显示变化:screen.on('display-added', callback) |
• 多显示器环境需判断窗口所在屏幕 • 屏幕尺寸可能随分辨率变化 • 可用于实现多屏展示应用 |
process | 进程信息 | • 环境变量:process.env.NODE_ENV • 内存使用: process.getProcessMemoryInfo() • 架构信息:process.arch |
• 渲染进程中环境变量可能受限 • 内存信息获取是异步操作 • 可用于条件加载不同资源 |
crashReporter | 崩溃报告 | • 配置崩溃报告: crashReporter.start({ productName: 'MyApp', companyName: 'MyCompany', submitURL: 'https://my-server.com/crashes'}) |
• 需在应用启动早期配置 • 开发环境可能不触发 • 可结合 Sentry 等服务使用 |
四、应用生命周期深度解析
1. 生命周期阶段与核心事件
Electron 应用生命周期可分为四个阶段:
阶段 1:启动初始化
事件/方法 | 作用 | 示例 |
---|---|---|
app.whenReady() |
返回 Promise,等待应用就绪 | app.whenReady().then(createWindow) |
will-finish-launching |
macOS 特有,启动初期事件 | app.on('will-finish-launching', () => { app.setAsDefaultProtocolClient('myapp')}) |
app.isReady() |
检查是否已就绪 | if (!app.isReady()) waitFirst |
阶段 2:运行中交互
事件/方法 | 作用 | 示例 |
---|---|---|
activate |
应用被激活(如点击 Dock) | app.on('activate', () => { if (noWindows) createWindow()}) |
second-instance |
重复启动实例 | app.on('second-instance', () => { mainWindow.focus()}) |
open-file |
文件拖拽到应用(macOS) | app.on('open-file', (e,f) => { sendToRenderer(f)}) |
阶段 3:退出前准备
事件/方法 | 作用 | 示例 |
---|---|---|
before-quit |
即将退出(可取消) | app.on('before-quit', (e) => { if (unsaved) e.preventDefault()}) |
will-quit |
即将退出(不可取消) | app.on('will-quit', cleanupResources) |
app.exit() |
强制退出(不触发事件) | process.on('uncaughtException', () => app.exit(1)) |
阶段 4:退出完成
事件/方法 | 作用 | 示例 |
---|---|---|
quit |
应用已退出 | app.on('quit', (e, code) => { log(`退出码: ${code}`)}) |
五、场景化API组合示例
1. 文件操作流程
javascript
// 主进程:选择文件 → 读取内容 → 返回结果
ipcMain.handle('read-file', async (e) => {
const { filePaths } = await dialog.showOpenDialog({
properties: ['openFile'],
filters: [{ name: 'Text', extensions: ['txt'] }]
});
if (filePaths.length > 0) {
return fs.promises.readFile(filePaths[0], 'utf8');
}
});
// 渲染进程:调用 → 显示结果
document.querySelector('#read-btn').addEventListener('click', async () => {
try {
const content = await ipcRenderer.invoke('read-file');
document.querySelector('#content').textContent = content;
} catch (err) {
console.error('读取失败:', err);
}
});
2. 窗口状态记忆
javascript
const STATE_FILE = path.join(app.getPath('userData'), 'window-state.json');
// 保存窗口状态
function saveWindowState(win) {
const state = { ...win.getBounds(), isMaximized: win.isMaximized() };
fs.writeFileSync(STATE_FILE, JSON.stringify(state));
}
// 恢复窗口状态
function loadWindowState() {
try {
return JSON.parse(fs.readFileSync(STATE_FILE, 'utf8'));
} catch (e) {
return { width: 800, height: 600 };
}
}
// 创建窗口时应用状态
app.whenReady().then(() => {
const state = loadWindowState();
let win = new BrowserWindow({
x: state.x,
y: state.y,
width: state.width,
height: state.height,
webPreferences: { contextIsolation: true }
});
if (state.isMaximized) win.maximize();
win.on('close', () => saveWindowState(win));
});
这份速查表涵盖了 Electron 开发中 80% 的常用 API 和典型场景。建议根据具体需求结合官方文档深入学习,并关注安全性最佳实践(如启用 contextIsolation
、使用 contextBridge
暴露 API)。对于复杂功能,可进一步查阅 electron-store
、electron-builder
等生态库。