介绍
在 Electron 中, GUI 相关的模块原生 API(Native APIs) (如 dialog、menu 等) 仅在主进程中可用,在渲染进程中不可用。
罗列了以下几种方式
正式开始
实现进程的通信通常都会使用ipcMain 和 ipcRenderer 这两个模块
- ipcMain 在主进程中使用,用来处理渲染进程(网页)发送的同步和异步的信息
- ipcRenderer 在渲染进程中使用,用来发送同步或异步的信息给主进程,也可以用来接收主进程的回复信息。
ipcMain(主进程)
const {ipcMain} = require('electron')
// 监听渲染程序发来的事件
ipcMain.on('sendMainMessage', (event, data) => {
console.log(data) //data是渲染层发给主进程的数据
//sendSycn同步发送 发送同步消息将会阻塞整个渲染进程,你应该避免使用这种方式 - 除非你知道你在做什么。
event.sender.send('sendRenderMessage', '监听到渲染层的数据后回应数据"我是主进程返回的值"')
})
渲染进程
const { ipcRenderer} = require('electron')
// 发送事件给主进程
ipcRenderer.send('sendMainMessage', '传输给主进程的数据')
// 监听主进程发来的事件
ipcRenderer.on('sendRenderMessage', (event, data) => {
console.log(data) // 我是主进程返回的值
})
注意
切忌用 ipc 传递大量的数据,会有很大的性能问题,严重会让你整个应用卡住。
remote使用
上面已经说过GUI 相关的模块原生 API(Native APIs) (如 dialog、menu 等) 仅在主进程中可用,在渲染进程中不可用。那么必须使用 remote 模块。这样就可以调用 main 进程的方法,而不用显示发送进程间的信息。
注意:不一样的electron版本,remote获取方式不同,由于自己安装的是v13.6.6版本,所以就拿该版本举例
const { dialog } = require('electron').remote
dialog.showMessageBox({type: 'info', message: '在渲染进程中直接使用主进程的模块'})
渲染进程间的通信
大多情况下,我们大多习惯使用如 localStorage、sessionStorage 等实现通信,同时Electron给提供了渲染进程通讯的IPC机制。
主进程
global.sharedObject = {
someProperty: '默认数据'
}
渲染进程
- A页面
require('electron').remote.getGlobal('sharedObject').someProperty = 'A页面修改后的数据'
- B页面
console.log(require('electron').remote.getGlobal('sharedObject').someProperty) // A页面修改后的数据
总结一下:实现进程之间的通信,可以发现使用 remote 模块是最简单的,渲染进程代码中可以直接使用 electron 模块
后续继续跟进其他版本的remote的使用,以上借鉴了https://www.jianshu.com/p/4dff80a333a8