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 的灵活性使其成为现代桌面开发的强大工具!