Electron 通信
文章目录
Electron 中有两种进程:主进程和渲染进程。
主进程
一个 electron 应用只有一个主进程,主进程指的是 package.json
文件中 main
字段指定的文件。主进程通过 BrowserWindow
实例来创建窗口,例如:
|
|
主进程管理所有窗口极其渲染进程。
渲染进程
electron 的每一个 BrowserWindow
都在一个独立的渲染进程中渲染页面,当一个 BrowserWindow
实例被删除,它对应的渲染进程也会终止运行。每个渲染进程都是相互独立的,只需要关注自己对应的页面。
如何通信
那主进程和渲染进程是怎么通信的呢?那就要用到新的模块:ipcMain
和 ipcRenderer
。
主进程给渲染进程发送消息
主进程中通过 BrowserWindow
对象的 webContents
的 send
方法来向渲染进程发送消息:
|
|
|
|
渲染进程给主进程发消息
主进程通过 ipcMain
模块的 on
方法监听消息。第一个参数是消息标识,第二个参数是回调函数。如 ipcMain.on(channel, (event, ...args) => {})
,可以通过 event.sender.send
向发送对象回传消息。
|
|
渲染进程通过 ipcRenderer
模块的 on
方法监听消息。第一个参数是消息标识,第二个参数是回调函数。如 ipcRenderer.on(channel, (event, ...arg) => {})
。通过 send
或 sendSync
方法发送消息,如 ipcRenderer.send(channel, ...args)
|
|
渲染进程给渲染进程发消息
渲染进程也可以通过 ipcRenderer
模块的 sendTo
方法给别的渲染进程发送消息,如 ipcRenderer.sendTo(webContentsId, channel, ...args)
,这里的 webContentsId
对应的就是另一个渲染进程的 webContentsId
。
其他方法
看两个模块的 api 时会发现还有一些额外的方法,也可以支持进程间的通信。
ipcRenderer
ipcRenderer.once(channel, (event, ...arg) => {})
监听到消息之后只执行一次,随后就移除掉了。ipcRenderer.invoke(channel, ...args)
调用后会返回 Promise,针对这个方法,主进程应该使用ipcMain.handle()
方法来响应,如下:
|
|
invoke
和 send
区别在哪里呢,如果不需要响应消息,可以使用 send
。
ipcRenderer.removeListener(channel, (event, ...arg) => {})
从监听器数组中移除监听channel
的指定listener
。ipcRenderer.removeAllListeners(channel)
从监听器数组中移除监听channel
的所有监听器。
ipcMain
-
ipcMain.once(channel, (event, ...arg) => {})
监听到消息之后只执行一次,随后就移除掉了。 -
ipcMain.handle(channel, listener)
响应ipcRenderer.invoke(channel, ...args)
。 -
ipcMain.handleOnce(channel, listener)
响应ipcRenderer.invoke(channel, ...args)
,也是只执行一次。 -
ipcMain.removeListener(channel, (event, ...arg) => {})
从监听器数组中移除监听channel
的指定listener
。 -
ipcMain.removeAllListeners(channel)
从监听器数组中移除监听channel
的所有监听器。 -
ipcMain.removeHandler(channel)
移除名称为channel
的handler
。
参考资料
文章作者 youting
上次更新 2021-02-04