electron 主进程和渲染进程通信 ipcMain ipcRenderer
发布于 作者:苏南大叔 来源:程序如此灵动~electron
分为主进程和渲染进程,主进程和渲染进程进行通信的时候,就需要用到ipc
这个特性。而ipc
又分为ipcMain
和ipcRenderer
两个方面,分别用于主进程和渲染进程。本文中,苏南大叔就ipcMain
和ipcRenderer
这两个特性进行简要描述。
本文例子,来自于 http://electron.org.cn/doc/api/ipc-main.html 。一共有三个概念,channel
事件名称(频道),async
异步,sync
同步。本文的测试环境是:electron@3.0.5
。
async
异步消息的发送与返回
- 渲染进程使用
ipcRenderer.send
发送异步消息,然后使用on
事件监控主进程的返回值。 - 主进程使用
on
事件监听消息,使用event.sender.send
返回数据。 - 渲染进程和主进程进行关联,使用的关键词就是:
channel
。
下面是个使用的简单范例:
index.html
:
const {ipcRenderer} = require('electron')
ipcRenderer.send('asynchronous-message', 'ping')
ipcRenderer.on('asynchronous-reply', (event, arg) => {
console.log(arg) // prints "pong"
})
main.js
:
const {ipcMain} = require('electron')
ipcMain.on('asynchronous-message', (event, arg) => {
console.log(arg) // prints "ping"
event.sender.send('asynchronous-reply', 'pong')
});
function createWindow () {
//...
}
app.on('ready', createWindow)
sync
同步消息的发送与返回
- 渲染进程使用
ipcRenderer.sendSync
发送同步消息。 - 主进程使用
on
事件监控消息,使用event.returnValue
返回数据给渲染进程。 - 返回值在渲染进程中,就直接体现为
ipcRenderer.sendSync
的函数返回值。
因为这种同步sync
的方式,会阻碍渲染进程的渲染,所以,应该尽量避免使用这种同步sync
方式。
index.html
:
const { ipcRenderer } = require('electron')
console.log(ipcRenderer.sendSync('synchronous-message', 'ping')) // prints "pong"
main.js
:
const {ipcMain} = require('electron')
ipcMain.on('synchronous-message', (event, arg) => {
console.log(arg) // prints "ping"
event.returnValue = 'pong'
})
function createWindow () {
//...
}
app.on('ready', createWindow)
值得注意的是:主进程和渲染进程的输出位置是不一样的。那么,读者所看到的ping
和pong
也不是同一个位置。具体可以参见下面这篇文字:
主进程主动发送消息到渲染进程
在官方的范例中,苏南大叔找到的demo
,都是渲染进程主动发起事件的。不过,主进程也应该有可能有需要发起事件请求。对吧?
主进程主动发送消息的理论依据是:async
异步消息的返回值方法:event.sender.send
。根据官方的说法,event.sender
就是webContents
,两者是同一个事物。那么,主进程主动异步发送消息的代码如下:
当然,下面的代码,是苏南大叔自己写的,并没有得到其他地方的代码呼应验证,大家请谨慎参考。
main.js
:
index.html
:
const { ipcRenderer } = require('electron')
ipcRenderer.on('asynchronous-reply', (event, arg) => {
console.log(arg) // prints "pong!!!"
})
这个代码里面涉及到一个新的事件:webContents
的did-finish-load
事件。对比一下熟知的jquery
的话,苏南大叔认为,可能就是类似jq
的$(function(){})
的类似事件。
总结
正确理解了主进程和渲染进程的通信方式,才能更好的把控electron
程序。当然,这些事件监听还有很多相关事件,比如once
,remove
之类的事件。不过,使用的概率相对较小。目前就不在本文的探讨范围内了。
当然,渲染进程之间相互发消息,而不经过主进程,也是可以的。请期待苏南大叔的后续electron
相关经验文字,请点击下面的链接阅读:
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。
看隐藏内容
隐藏内容
查看隐藏内容
在这里学了不少黑科技
不错
写的不错!
学校学校
想在程序退出的时候对LocalStorage里对一些东西进行保存到文件或者磁盘,渲染进程主动向主进程到使用方法比较熟悉了,所以想看看主进程怎么通知渲染进程到
写得比较易懂
学习了
想看看隐藏内容
崇拜的查看隐藏内容
写的不错!