Skip to content

IPC通信

在 Electron 中,进程间通信(IPC)是主进程和渲染进程之间进行数据交换的主要方式。Electron 提供了两种 IPC 方法:ipcMainipcRenderer

1. ipcMain (主进程)

ipcMain 是在主进程中定义的模块,用于监听来自渲染进程的消息。

javascript
// 主进程中的代码
const { ipcMain } = require('electron')

ipcMain.on('asynchronous-message', (event, arg) => {
  console.log(arg)  // 打印接收到的消息
  event.reply('asynchronous-reply', 'pong')  // 回复消息给渲染进程
})

2. ipcRenderer (渲染进程)

ipcRenderer 是在渲染进程中定义的模块,用于向主进程发送消息和接收主进程的回复。

javascript
// 渲染进程中的代码
const { ipcRenderer } = require('electron')

ipcRenderer.send('asynchronous-message', 'ping')

ipcRenderer.on('asynchronous-reply', (event, arg) => {
  console.log(arg)  // 打印从主进程接收到的回复
})

同步通信

除了异步通信外,ipcRenderer 还支持同步通信。但是请注意,由于同步通信会阻塞渲染进程,因此不建议在 UI 线程中使用,除非你确定这不会影响到用户体验。

javascript
// 渲染进程中的代码
const { ipcRenderer } = require('electron')

let response = ipcRenderer.sendSync('synchronous-message', 'ping')
console.log(response)

3. 使用 IPC 传递复杂对象

你可以通过 IPC 传递 JSON 序列化后的任何对象,包括数组、对象等。

javascript
// 主进程
ipcMain.on('complex-message', (event, arg) => {
  console.log(arg.someProperty)  // 访问对象属性
  event.reply('complex-reply', { response: 'pong' })
})

// 渲染进程
ipcRenderer.send('complex-message', { someProperty: 'someValue' })

ipcRenderer.on('complex-reply', (event, arg) => {
  console.log(arg.response)  // 打印回复的对象属性
})

总之,IPC 在 Electron 中是非常重要的功能,它允许你轻松地在主进程和渲染进程之间进行通信,实现复杂的应用逻辑。