ipcRenderer
从渲染进程异步通信到主进程。
进程:渲染器
ipcRenderer
模块是一个 EventEmitter。它提供了一些方法,以便您可以从渲染进程(网页)向主进程发送同步和异步消息。您还可以接收来自主进程的回复。
请参阅 IPC 教程 以获取代码示例。
方法
ipcRenderer
模块具有以下方法来侦听事件和发送消息
ipcRenderer.on(channel, listener)
channel
字符串listener
函数event
IpcRendererEvent...args
any[]
侦听 channel
,当有新消息到达时,listener
将使用 listener(event, args...)
调用。
ipcRenderer.off(channel, listener)
channel
字符串listener
函数event
IpcRendererEvent...args
any[]
ipcRenderer.removeListener
的别名。
ipcRenderer.once(channel, listener)
channel
字符串listener
函数event
IpcRendererEvent...args
any[]
为事件添加一次性 listener
函数。此 listener
仅在下一次将消息发送到 channel
时调用,之后它将被删除。
ipcRenderer.addListener(channel, listener)
channel
字符串listener
函数event
IpcRendererEvent...args
any[]
ipcRenderer.on
的别名。
ipcRenderer.removeListener(channel, listener)
channel
字符串listener
函数event
IpcRendererEvent...args
any[]
从指定 channel
的侦听器数组中删除指定的 listener
。
ipcRenderer.removeAllListeners(channel)
channel
字符串
删除所有侦听器,或指定 channel
的侦听器。
ipcRenderer.send(channel, ...args)
channel
字符串...args
any[]
通过 channel
向主进程发送异步消息,以及参数。参数将使用 结构化克隆算法 进行序列化,就像 window.postMessage
一样,因此不会包含原型链。发送函数、Promise、Symbol、WeakMap 或 WeakSet 将引发异常。
注意:发送非标准 JavaScript 类型(例如 DOM 对象或特殊 Electron 对象)将引发异常。
由于主进程不支持
ImageBitmap
、File
、DOMMatrix
等 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 对象)将引发异常。
由于主进程不支持
ImageBitmap
、File
、DOMMatrix
等 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 对象)将引发异常。
由于主进程不支持
ImageBitmap
、File
、DOMMatrix
等 DOM 对象,因此此类对象无法通过 Electron 的 IPC 发送到主进程,因为主进程无法解码它们。尝试通过 IPC 发送此类对象将导致错误。
主进程通过使用 ipcMain
模块侦听 channel
并通过设置 event.returnValue
来进行回复来处理它。
⚠️ 警告:发送同步消息将阻塞整个渲染进程,直到收到回复,因此仅在万不得已时才使用此方法。最好使用异步版本
invoke()
。
ipcRenderer.postMessage(channel, message, [transfer])
channel
字符串message
anytransfer
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
// ...
})
有关使用 MessagePort
和 MessageChannel
的更多信息,请参阅 MDN 文档。
ipcRenderer.sendToHost(channel, ...args)
channel
字符串...args
any[]
类似于 ipcRenderer.send
,但事件将发送到主机页面中的 <webview>
元素而不是主进程。