理解 Electron 的进程架构,是开发高效稳定桌面应用的关键。本篇将详解 Electron 的核心机制:主进程(Main Process)与渲染进程(Renderer Process),以及它们如何通过 IPC 协同工作。
Electron 应用 = 主进程 + 多个渲染进程
主进程:
main.js
示例:创建主窗口
const { app, BrowserWindow } = require('electron');
app.whenReady().then(() => {
const win = new BrowserWindow({ width: 800, height: 600 });
win.loadFile('index.html');
});
主进程还负责处理:
渲染进程:
可通过 preload.js
显式暴露 API:
// preload.js
const { contextBridge, ipcRenderer } = require('electron');
contextBridge.exposeInMainWorld('myAPI', {
sendMessage: (msg) => ipcRenderer.send('msg', msg)
});
<button onclick="window.myAPI.sendMessage('Hello Main')">发消息button>
Electron 提供 IPC
(Inter-Process Communication)机制,允许主进程和渲染进程之间安全通信。
// 渲染进程
ipcRenderer.send('channel-name', data);
// 主进程
ipcMain.on('channel-name', (event, data) => {
console.log('收到数据:', data);
});
// 主进程
mainWindow.webContents.send('reply-channel', '你好,渲染进程');
// 渲染进程
ipcRenderer.on('reply-channel', (event, msg) => {
console.log('主进程发来消息:', msg);
});
避免直接在渲染进程使用 require('electron')
,应使用 contextBridge
创建中间层暴露白名单 API。
// preload.js
contextBridge.exposeInMainWorld('secureAPI', {
getVersion: () => ipcRenderer.invoke('get-app-version')
});
// 主进程
ipcMain.handle('get-app-version', () => {
return app.getVersion();
});
功能 | 主进程 | 渲染进程 |
---|---|---|
控制应用生命周期 | ✅ | ❌ |
访问 Node.js 全部 API | ✅ | 默认❌ |
创建窗口 | ✅ | ❌ |
渲染页面 | ❌ | ✅ |
使用 DOM、CSS、HTML | ❌ | ✅ |
托盘、菜单栏、通知 | ✅ | ❌ |
Electron 中每个窗口 = 独立的 Chromium 进程,内存占用较高。
建议复用窗口,避免滥用窗口数量。
可使用 webPreferences
限制渲染进程权限:
new BrowserWindow({
webPreferences: {
nodeIntegration: false,
contextIsolation: true,
preload: path.join(__dirname, 'preload.js')
}
});
名称 | 作用 |
---|---|
主进程(Main) | 应用入口,创建窗口,系统交互,生命周期控制 |
渲染进程(Renderer) | 展示 UI,运行页面代码 |
IPC 通信 | 实现进程间交互(事件、数据) |
preload.js | 安全桥接渲染与主进程,提升安全性 |