跳至主要内容

ipcRenderer

历史记录

从渲染进程异步通信到主进程。

进程:渲染器

ipcRenderer 模块是一个 EventEmitter。它提供了一些方法,以便您可以从渲染进程(网页)向主进程发送同步和异步消息。您还可以接收来自主进程的回复。

请参阅 IPC 教程 以获取代码示例。

方法

ipcRenderer 模块具有以下方法来侦听事件和发送消息

ipcRenderer.on(channel, listener)

侦听 channel,当有新消息到达时,listener 将使用 listener(event, args...) 调用。

ipcRenderer.off(channel, listener)

ipcRenderer.removeListener 的别名。

ipcRenderer.once(channel, listener)

为事件添加一次性 listener 函数。此 listener 仅在下一次将消息发送到 channel 时调用,之后它将被删除。

ipcRenderer.addListener(channel, listener)

ipcRenderer.on 的别名。

ipcRenderer.removeListener(channel, listener)

从指定 channel 的侦听器数组中删除指定的 listener

ipcRenderer.removeAllListeners(channel)

  • channel 字符串

删除所有侦听器,或指定 channel 的侦听器。

ipcRenderer.send(channel, ...args)

  • channel 字符串
  • ...args any[]

通过 channel 向主进程发送异步消息,以及参数。参数将使用 结构化克隆算法 进行序列化,就像 window.postMessage 一样,因此不会包含原型链。发送函数、Promise、Symbol、WeakMap 或 WeakSet 将引发异常。

注意:发送非标准 JavaScript 类型(例如 DOM 对象或特殊 Electron 对象)将引发异常。

由于主进程不支持 ImageBitmapFileDOMMatrix 等 DOM 对象,因此此类对象无法通过 Electron 的 IPC 发送到主进程,因为主进程无法解码它们。尝试通过 IPC 发送此类对象将导致错误。

主进程通过使用 ipcMain 模块侦听 channel 来处理它。

如果您需要将 MessagePort 传输到主进程,请使用 ipcRenderer.postMessage

如果您希望从主进程接收单个响应(例如方法调用的结果),请考虑使用 ipcRenderer.invoke

ipcRenderer.invoke(channel, ...args)

  • channel 字符串
  • ...args any[]

返回 Promise<any> - 使用来自主进程的响应解析。

通过 channel 向主进程发送消息并异步地预期结果。参数将使用 结构化克隆算法 进行序列化,就像 window.postMessage 一样,因此不会包含原型链。发送函数、Promise、Symbol、WeakMap 或 WeakSet 将引发异常。

主进程应使用 ipcMain.handle() 侦听 channel

例如

// Renderer process
ipcRenderer.invoke('some-name', someArgument).then((result) => {
// ...
})

// Main process
ipcMain.handle('some-name', async (event, someArgument) => {
const result = await doSomeWork(someArgument)
return result
})

如果您需要将 MessagePort 传输到主进程,请使用 ipcRenderer.postMessage

如果您不需要对消息进行响应,请考虑使用 ipcRenderer.send

注意 发送非标准 JavaScript 类型(例如 DOM 对象或特殊 Electron 对象)将引发异常。

由于主进程不支持 ImageBitmapFileDOMMatrix 等 DOM 对象,因此此类对象无法通过 Electron 的 IPC 发送到主进程,因为主进程无法解码它们。尝试通过 IPC 发送此类对象将导致错误。

注意 如果主进程中的处理程序引发错误,则 invoke 返回的 promise 将被拒绝。但是,渲染进程中的 Error 对象与主进程中引发的 Error 对象不相同。

ipcRenderer.sendSync(channel, ...args)

  • channel 字符串
  • ...args any[]

返回 any - 由 ipcMain 处理程序发回的值。

通过 channel 向主进程发送消息并同步地预期结果。参数将使用 结构化克隆算法 进行序列化,就像 window.postMessage 一样,因此不会包含原型链。发送函数、Promise、Symbol、WeakMap 或 WeakSet 将引发异常。

注意:发送非标准 JavaScript 类型(例如 DOM 对象或特殊 Electron 对象)将引发异常。

由于主进程不支持 ImageBitmapFileDOMMatrix 等 DOM 对象,因此此类对象无法通过 Electron 的 IPC 发送到主进程,因为主进程无法解码它们。尝试通过 IPC 发送此类对象将导致错误。

主进程通过使用 ipcMain 模块侦听 channel 并通过设置 event.returnValue 来进行回复来处理它。

⚠️ 警告:发送同步消息将阻塞整个渲染进程,直到收到回复,因此仅在万不得已时才使用此方法。最好使用异步版本 invoke()

ipcRenderer.postMessage(channel, message, [transfer])

  • channel 字符串
  • message any
  • transfer MessagePort[](可选)

向主进程发送消息,可以选择性地传输零个或多个 MessagePort 对象的所有权。

传输的 MessagePort 对象将在主进程中作为 MessagePortMain 对象使用,方法是访问已发出事件的 ports 属性。

例如

// Renderer process
const { port1, port2 } = new MessageChannel()
ipcRenderer.postMessage('port', { message: 'hello' }, [port1])

// Main process
ipcMain.on('port', (e, msg) => {
const [port] = e.ports
// ...
})

有关使用 MessagePortMessageChannel 的更多信息,请参阅 MDN 文档

ipcRenderer.sendToHost(channel, ...args)

  • channel 字符串
  • ...args any[]

类似于 ipcRenderer.send,但事件将发送到主机页面中的 <webview> 元素而不是主进程。