Electron 中的兩種進程通信方式,分別為:
- 使用 ipcMain 和 ipcRenderer 兩個模塊
- 使用 remote 模塊
一、 ipcRenderer
從渲染器進程到主進程的異步通信。
ipcRenderer
是一個 EventEmitter 的實例。 你可以使用它提供的一些方法從渲染進程 (web 頁面) 發送同步或異步的消息到主進程。 也可以接收主進程回復的消息。
1.1 方法
ipcRenderer.send(channel, ...args)
通過channel向主進程發送異步消息,可以發送任意參數。
ipcRenderer.on(channel, listener)
-
channel
String -
listener
Function-
event
IpcRendererEvent -
...args
any[]
-
監聽 channel
,當接收到新的消息時 listener
會以 listener(event, args...)
的形式被調用。
二、ipcMain
從主進程到渲染進程的異步通信。
也可以從主進程向渲染進程發送消息,查閱ebContents.send獲取更多信息。
- 發送消息時,事件名稱為
channel
。 - 回復同步信息時,需要設置
event.returnValue
。 - 可以使用
event.reply(...)
將異步消息發送回發送者。 This helper method will automatically handle messages coming from frames that aren't the main frame (e.g. iframes) whereasevent.sender.send(...)
will always send to the main frame.
2.1方法
ipcMain.on(channel, listener)
-
channel
String -
listener
Function-
event
IpcMainEvent -
...args
any[]
-
監聽 channel
,當接收到新的消息時 listener
會以 listener(event, args...)
的形式被調用。
異步通信示例:
ipcRenderer 代碼:
import { ipcRenderer } from 'electron'
ipcRenderer.send('toMain', data) // 向主進程發送消息
ipcRenderer.on('fromMain', (event, ...args) => func(...args)) // 監聽
ipcMain 代碼:
import { ipcMain} from 'electron'
ipcMain.on('toMain', function (event, arg) { // 監聽渲染進程,傳遞的數據
// 邏輯處理
event.reply('fromMain', arg); // 返回給渲染進程處理好的數據
});
同步通信示例:
ipcRenderer代碼
ipcRenderer.sendSync(channel, data)
ipcMain 代碼
ipcMain.on('syncGetLocalServer', function (event, arg) {
// 讀入文件,同步返回數據
fs.readFile("./localServer.xml", { encoding: "utf-8" }, (err, data) => {
event.returnValue=data; // 返回給渲染進程
})
});