Electron为主进程( main process)和渲染器进程(renderer processes)通信提供了多种实现方式,如可以使用[`ipcRenderer`](https://www.electronjs.org/docs/api/ipc-renderer)和[`ipcMain`](https://www.electronjs.org/docs/api/ipc-main)模块发送消息,使用[remote](https://www.electronjs.org/docs/api/remote)模块进行RPC方式通信
## [ipcMain](https://www.electronjs.org/docs/api/ipc-main)
>从主进程到渲染进程的异步通信
### [`ipcMain.on(channel, listener)`](https://www.electronjs.org/docs/api/ipc-main#ipcmainonchannel-listener)
监听`channel`(channel为自定义的字符串),当接收到新的消息时`listener`会以`listener(event, args...)`的形式被调用。
下面是在渲染和主进程之间发送和处理消息的一个例子:
~~~
main.js
// 在主进程中.
const { ipcMain, BrowserWindow} = require('electron')
let mainWindow
app.on('ready', createWindow)
//当应用被激活时发送异步消息。 各种操作都可以触发此事件, 例如首次启动应用程序、尝试在应用程序已运行时或单击应用程序的坞站或任务栏图标时重新激活它
app.on('activate', function () {
if (mainWindow === null){
createWindow()
}
//主动发送消异步消息到渲染进程(演示用)
setTimeout(()=>{
mainWindow.webContents.send
},5000);
//主动发送消异步消息到渲染进程
mainWindow.webContents.on('did-finish-load', () => {
mainWindow.webContents.send('asynchronous-message', '嘿嘿嘿!')
})
})
function createWindow () {
mainWindow = new BrowserWindow({
width: 800,
height: 600,
webPreferences: {
preload: path.join(__dirname, 'preload.js')
}
})
mainWindow.loadFile('index.html')
mainWindow.on('closed', function () {
mainWindow = null
});
}
//监听渲染进程的异步消息并被动响应
ipcMain.on('asynchronous-message', (event, arg) => {
console.log("主进程收到的消息:",arg) // prints "ping"
//向渲染进程响应(发送)数据,异步方法用reply
event.reply('asynchronous-reply', 'pong')
})
//监听渲染进程的同步消息并被动响应
ipcMain.on('synchronous-message', (event, arg) => {
console.log(arg) // prints "ping"
//响应渲染进程的消息,同步方法用returnValue
event.returnValue = 'pong'
})
~~~
## [ipcRenderer](https://www.electronjs.org/docs/api/ipc-renderer)
>从渲染器进程到主进程的异步通信。
~~~
//在渲染器进程 (网页) 中。
const { ipcRenderer } = require('electron')
//通过`channel`发送同步消息到主进程
console.log(ipcRenderer.sendSync('synchronous-message', 'ping')) // prints "pong"
//ipcRenderer.on(channel, listener)
//监听 channel,接受主进程的消息 当新消息到达,将通过 listener(event, args...) 调用 listener
ipcRenderer.on('asynchronous-reply', (event, arg) => {
console.log('渲染进程接受到的数据',arg) // prints "pong"
})
//发送异步消息到主进程 ipcRenderer.send(channel, ...args)
ipcRenderer.send('asynchronous-message', 'ping')
~~~
- npm
- 基础
- Api
- 安装
- node_modules本地安装与全局安装
- Inspector
- 模块
- hello world
- 使用nodejs开发桌面客户端应用
- Electron
- api
- 使用 Node.js 的 API
- 事件
- 安装
- 调试
- 读取本地文件
- 调用Html5的拖放api
- 官方示例下载
- WebView内嵌窗口
- window.open弹出子窗口及其操作
- BrowserWindow渲染主窗口
- 主进程与渲染进程的通信
- 菜单
- 网络
- 与react结合
- 打包
- 前言
- 对比
- electron-forge
- 打包工具一:electron-packager
- 打包工具二:electron-builder
- Boilerplates样板工程
- 通用配置文档
- NW.js
- 阿斯达岁的
- npm install、npm install --save与npm install --save-dev区别