Electron 项目目录结构解析
源代码仓库:
Github仓库【electron_git】

一、main/index.js 主进程代码解读
import { app, shell, BrowserWindow, ipcMain } from 'electron'
import { join } from 'path'
import { electronApp, optimizer, is } from '@electron-toolkit/utils'
import icon from '../../resources/icon.png?asset'
function createWindow() {
const mainWindow = new BrowserWindow({
width: 900,
height: 670,
show: false,
autoHideMenuBar: true,
...(process.platform === 'linux' ? { icon } : {}),
webPreferences: {
preload: join(__dirname, '../preload/index.js'),
sandbox: false
}
})
mainWindow.on('ready-to-show', () => {
mainWindow.show()
})
mainWindow.webContents.setWindowOpenHandler((details) => {
shell.openExternal(details.url)
return { action: 'deny' }
})
if (is.dev && process.env['ELECTRON_RENDERER_URL']) {
mainWindow.loadURL(process.env['ELECTRON_RENDERER_URL'])
} else {
mainWindow.loadFile(join(__dirname, '../renderer/index.html'))
}
}
app.whenReady().then(() => {
electronApp.setAppUserModelId('com.electron')
app.on('browser-window-created', (_, window) => {
optimizer.watchWindowShortcuts(window)
})
ipcMain.on('ping', () => console.log('pong'))
createWindow()
app.on('activate', function () {
if (BrowserWindow.getAllWindows().length === 0) createWindow()
})
})
app.on('window-all-closed', () => {
if (process.platform !== 'darwin') {
app.quit()
}
})
Electron 常用回调事件
主进程 (Main Process) 事件
app 事件
| 事件名 | 触发时机 | 说明 |
|---|
app.whenReady() | Electron 初始化完成后 | 应用准备就绪,可创建窗口 |
app.on('window-all-closed', callback) | 所有窗口关闭时 | 在 macOS 需要手动退出应用 |
app.on('before-quit', callback) | 应用退出前 | 适合做清理工作 |
app.on('will-quit', callback) | 应用即将退出 | 取消 quit 事件可以阻止退出 |
app.on('activate', callback) | macOS 上点击 Dock 图标时 | 适用于 macOS 上重新创建窗口 |
app.on('ready', callback) | Electron 初始化完成后 | 监听 ready 事件创建窗口 |
BrowserWindow 事件
| 事件名 | 触发时机 | 说明 |
|---|
browserWindow.on('close', callback) | 窗口即将关闭 | 可以阻止窗口关闭 |
browserWindow.on('closed', callback) | 窗口关闭后 | 窗口对象被销毁 |
browserWindow.on('focus', callback) | 窗口获取焦点时 | 可用于 UI 交互逻辑 |
browserWindow.on('blur', callback) | 窗口失去焦点时 | 可用于暂停某些操作 |
browserWindow.on('maximize', callback) | 窗口最大化时 | 适用于 UI 适配 |
browserWindow.on('unmaximize', callback) | 取消最大化时 | 适用于 UI 适配 |
browserWindow.on('minimize', callback) | 窗口最小化时 | 适用于后台任务管理 |
browserWindow.on('restore', callback) | 窗口恢复时 | 用于 UI 适配 |
browserWindow.on('resize', callback) | 窗口大小变化时 | 适用于自适应 UI |
渲染进程 (Renderer Process) 事件
ipcRenderer 事件
| 事件名 | 触发时机 | 说明 |
|---|
ipcRenderer.send(channel, ...args) | 发送事件到主进程 | 渲染进程向主进程发送数据 |
ipcRenderer.on(channel, callback) | 监听主进程事件 | 主进程返回数据时触发 |
ipcRenderer.once(channel, callback) | 监听事件(仅触发一次) | 监听一次后自动移除 |
ipcRenderer.removeListener(channel, callback) | 移除指定监听事件 | 清理监听,防止内存泄漏 |
ipcRenderer.removeAllListeners(channel) | 移除所有监听事件 | 彻底清除事件 |
系统级事件
powerMonitor 事件
| 事件名 | 触发时机 | 说明 |
|---|
powerMonitor.on('suspend', callback) | 系统进入睡眠 | 监听系统进入睡眠 |
powerMonitor.on('resume', callback) | 系统恢复运行 | 监听系统从睡眠恢复 |
powerMonitor.on('on-ac', callback) | 连接电源适配器 | 监听设备充电 |
powerMonitor.on('on-battery', callback) | 使用电池供电 | 监听设备断开电源 |
systemPreferences 事件
| 事件名 | 触发时机 | 说明 |
|---|
systemPreferences.getAccentColor() | 获取系统主题颜色 | 适用于 UI 适配 |
systemPreferences.getEffectiveAppearance() | 获取深色/浅色模式 | 适用于 UI 主题切换 |
快捷键事件
globalShortcut 事件
| 事件名 | 触发时机 | 说明 |
|---|
globalShortcut.register('CommandOrControl+X', callback) | 监听快捷键 | 可用于全局快捷键 |
globalShortcut.unregisterAll() | 移除所有快捷键 | 适用于应用关闭时清理 |