Electron 是一个基于 Chromium 和 Node.js 的框架,允许开发者使用 Web 技术(HTML、CSS、JavaScript)构建跨平台的桌面应用程序。许多知名应用(如 VS Code、Slack、Discord)都基于 Electron 开发。Electron 的核心模块是其强大功能的基石,理解这些模块对于开发高效、稳定的桌面应用至关重要。
本文将深入探讨 Electron 的核心模块,包括主进程模块、渲染进程模块以及通用模块,并通过代码示例展示它们的实际应用。

1. Electron 架构概述
Electron 采用 多进程架构,主要由两个核心进程组成:
主进程(Main Process)
运行在 Node.js 环境中,负责管理应用生命周期、窗口创建、系统交互等。
使用
app、BrowserWindow、Menu等模块。
渲染进程(Renderer Process)
每个
BrowserWindow都是一个独立的渲染进程,运行 Chromium 渲染引擎。负责 UI 渲染,使用
ipcRenderer、webFrame等模块与主进程通信。
此外,还有一些 通用模块(如 shell、clipboard)可以在两个进程中使用。
2. 主进程(Main Process)核心模块
2.1 app - 应用生命周期管理
app 模块控制 Electron 应用的启动、运行和退出。常见用法:
const { app } = require('electron')
// 应用初始化完成后执行
app.on('ready', () => {
console.log('App is ready!')
})
// 所有窗口关闭时(Mac 上可能不会退出)
app.on('window-all-closed', () => {
if (process.platform !== 'darwin') app.quit()
})
// 获取系统路径
console.log(app.getPath('downloads')) // 输出下载目录路径
关键方法:
app.quit()- 强制退出应用。app.getPath(name)- 获取系统目录(如documents、temp)。app.on(event, callback)- 监听生命周期事件(如ready、before-quit)。
2.2 BrowserWindow - 窗口管理
BrowserWindow 用于创建和控制应用窗口:
const { BrowserWindow } = require('electron')
const win = new BrowserWindow({
width: 800,
height: 600,
webPreferences: {
nodeIntegration: true, // 允许渲染进程使用 Node.js API
}
})
win.loadFile('index.html') // 加载页面
win.webContents.openDevTools() // 打开开发者工具
关键功能:
win.loadURL()/win.loadFile()- 加载网页或本地文件。win.minimize()/win.maximize()- 最小化/最大化窗口。win.webContents- 控制网页内容(如reload()、executeJavaScript())。
2.3 Menu / MenuItem - 创建原生菜单
Electron 允许自定义菜单栏和右键菜单:
const { Menu, BrowserWindow } = require('electron')
// 创建菜单模板
const template = [
{
label: '文件',
submenu: [
{ label: '打开', click: () => console.log('打开文件') },
{ type: 'separator' },
{ label: '退出', role: 'quit' } // 内置角色
]
}
]
const menu = Menu.buildFromTemplate(template)
Menu.setApplicationMenu(menu) // 设置应用菜单
// 右键上下文菜单
const ctxMenu = Menu.buildFromTemplate([{ label: '复制', role: 'copy' }])
window.webContents.on('context-menu', () => ctxMenu.popup())
关键点:
role属性可使用系统默认行为(如quit、copy)。Menu.setApplicationMenu()设置顶部菜单栏。
2.4 ipcMain - 主进程通信
ipcMain 用于主进程与渲染进程通信:
const { ipcMain } = require('electron')
ipcMain.on('msg-from-renderer', (event, data) => {
console.log(data) // 接收渲染进程消息
event.reply('msg-to-renderer', 'Hello from Main!') // 回复
})
常见场景:
渲染进程请求文件读写。
主进程返回计算结果。
3. 渲染进程(Renderer Process)核心模块
3.1 ipcRenderer - 渲染进程通信
渲染进程通过 ipcRenderer 与主进程交互:
const { ipcRenderer } = require('electron')
// 发送消息给主进程
ipcRenderer.send('msg-from-renderer', 'Hello Main!')
// 接收主进程回复
ipcRenderer.on('msg-to-renderer', (event, data) => {
console.log(data) // 'Hello from Main!'
})
替代 remote(已弃用):
const result = await ipcRenderer.invoke('read-file', 'path.txt')
3.2 webFrame - 控制网页渲染
调整网页缩放、注入脚本:
const { webFrame } = require('electron')
webFrame.setZoomFactor(1.5) // 放大 1.5 倍
webFrame.insertCSS('body { background: red; }') // 注入 CSS
4. 通用模块
4.1 shell - 调用系统应用
打开链接、文件管理器:
const { shell } = require('electron')
shell.openExternal('https://electronjs.org') // 浏览器打开
shell.showItemInFolder('/path/to/file') // 显示文件
4.2 clipboard - 剪贴板操作
读写剪贴板内容:
const { clipboard } = require('electron')
clipboard.writeText('Hello!')
console.log(clipboard.readText()) // 'Hello!'
4.3 dialog - 系统对话框
显示文件选择框、消息提示:
const { dialog } = require('electron')
dialog.showOpenDialog({ properties: ['openFile'] })
.then(result => console.log(result.filePaths))
5. 总结
Electron 的核心模块提供了构建桌面应用所需的所有功能:
| 模块 | 用途 | 适用进程 |
|---|---|---|
app |
应用生命周期管理 | 主进程 |
BrowserWindow |
窗口管理 | 主进程 |
ipcMain/ipcRenderer |
进程通信 | 主进程/渲染进程 |
shell |
调用系统应用 | 通用 |
clipboard |
剪贴板操作 | 通用 |
掌握这些模块后,你可以高效开发跨平台桌面应用。Electron 的灵活性使其成为现代桌面开发的强大工具!