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
- node_modules本地安裝與全局安裝
- Inspector
- 模塊
- hello world
- 安裝插件的版本
- 更新package.json文件的插件版本
- 使用nodejs開發桌面客戶端應用
- Electron
- api
- 使用 Node.js 的 API
- 事件
- electron配置
- 安裝
- 調試
- 讀取本地文件
- 調用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區別