在 Electron 框架里, ipcRenderer 是用于在渲染进程与主进程间进行通信的模块, ipcRenderer.invoke 和 ipcRenderer.send 都能实现渲染进程向主进程发送消息,但它们存在显著区别,下面详细介绍。
1. 通信模式
- ipcRenderer.send :采用异步单向通信模式。渲染进程发送消息后,不会主动等待主进程的响应,继续执行后续代码。主进程若要反馈信息,需通过 ipcMain.send 主动发回给渲染进程。
- ipcRenderer.invoke :采用异步双向通信模式。渲染进程发送消息后会返回一个 Promise 对象,等待主进程处理完成并返回结果,可使用 await 或 .then() 来获取主进程的响应。
2. 消息处理与响应
- ipcRenderer.send :主进程使用 ipcMain.on 监听消息,处理完成后若要返回信息,需借助 event.sender.send 主动发回给渲染进程。
- ipcRenderer.invoke :主进程使用 ipcMain.handle 监听消息,直接通过返回值将结果返回给渲染进程,渲染进程通过 Promise 接收结果。
3. 使用场景
- ipcRenderer.send :适用于无需主进程立即反馈结果的场景,如通知主进程更新界面状态、记录日志等。
- ipcRenderer.invoke :适用于需要主进程返回处理结果的场景,如文件选择对话框、数据库查询等。
4. 代码示例
(1)ipcRenderer.send 示例
// 渲染进程代码 index.js
const api = {
resizeView: (options) => ipcRenderer.send('resize-view', options)
}
// 主进程代码 main.js
const { ipcMain } = require('electron');
ipcMain.on('resize-view', (event, options) => {
// 处理视图调整逻辑
console.log('收到调整视图的请求:', options);
// 若需要返回信息给渲染进程
// event.sender.send('resize-view-response', { status: 'success' });
});
(2)ipcRenderer.invoke 示例
// 渲染进程代码 index.js
const api = {
createHtmlView: (options) => ipcRenderer.invoke('create-html-view', options),
}
// 主进程代码 main.js
const { ipcMain } = require('electron');
ipcMain.handle('create-html-view', async (event, options) => {
// 处理创建 HTML 视图的逻辑
console.log('收到创建 HTML 视图的请求:', options);
// 返回处理结果给渲染进程
return { status: 'success', message: 'HTML 视图创建成功' };
});
综上所述,若你需要主进程返回处理结果,就用 ipcRenderer.invoke ;若只是单向通知主进程执行任务,无需即时反馈,就用 ipcRenderer.send 。
参考来源
Trae CN,chat问答。