Electron 主进程和渲染进程通信
有时候我们想在渲染进程中通过一个事件去执行主进程里面的方法。或者在渲染进程中通知主进程处理事件,主进程处理完成后广播一个事件让渲染进程去处理一些事情。这个时候就用到了主进程和渲染进程之间的相互通信。
Electron 主进程和渲染进程的通信主要用到两个模块:ipcMain 和 ipcRenderer
ipcMain:当在主进程中使用时,它处理从渲染器进程(网页)发送出来的异步和同步信息,当然也有可能从主进程向渲染进程发送消息。
ipcRenderer: 使用它提供的一些方法从渲染进程 (web 页面) 发送同步或异步的消息到主进程。 也可以接收主进程回复的消息。
- 场景 1:渲染进程给主进程发送异步消息:
// 渲染进程
//(新建 ipcRenderer.js 在 index.html 中引入)
const { ipcRenderer } = require('electron')
ipcRenderer.send('msg',{name:'张三'}); //异步
// ipcRenderer.send() 参数1:要触发的方法的名字,参数2:要传输的数据
// 主进程
//(新建ipcMain.js 在 Main.js 或者 index.js 中 require("路径/ipcMain.js");)
const { ipcMain } = require('electron');
ipcMain.on('msg',(event,data) => {
console.log(data);
})
// ipcMain.on() 参数1:要触发的方法的名字,参数2:回调函数,回调函数的参数1:事件对象,参数2:接收的传输过来的数据
- 场景 2:渲染进程给主进程发送异步消息,主进程接收到异步消息以后通知渲染进程
// 渲染进程
const { ipcRenderer } = require('electron')
ipcRenderer.send('fnName',{name:'张三'}); //异步
// 渲染进程监听主进程广播
ipcRenderer.on("reply",(event,data)=>{
console.log(data);
})
// 主进程
const { ipcMain } = require('electron');
ipcMain.on('fnName',(event,data) => {
console.log(data);
event.sender.send('reply', '我收到了消息');
// event.sender.send() 参数1:回复时触发方法的名称,参数2:要回复的数据
})
- 场景 3:渲染进程给主进程发送同步消息,主进程接收到同步消息以后通知渲染进程(上面第二种方法的简单版,send后面加上Sync表示同步,sendSync)
//渲染进程
const { ipcRenderer } = require('electron');
const msg = ipcRenderer.sendSync('fnNane',"数据"); // 返回主进程中返回的 value
console.log(msg); // hello
//主进程
ipcMain.on('msg-a',(event , data)=> {
console.log(data);
event.returnValue = 'hello'; // 给渲染进程回复消息 返回 value
})
- 场景 4:主进程通知渲染进程执行操作(头部菜单属于主进程,点击之后就通知渲染进程处理某件事情)
//主进程 BrowserWindow.getFocusedWindow().webContents.send('mainToRebderer','news');
// 菜单的某一项
// {
// label: "复制",
// role: "copy",
// click: () => {
// BrowserWindow.getFocusedWindow().webContents.send('mainToRebderer','news');
// }
// },
//渲染进程
const { ipcRenderer } = require('electron');
ipcRenderer.on('mainToRebderer', function(event, arg) {
console.log(arg); // news
});