Electron 中的兩種進(jìn)程通信方式,分別為:
- 使用 ipcMain 和 ipcRenderer 兩個(gè)模塊
- 使用 remote 模塊
一鞠抑、 ipcRenderer
從渲染器進(jìn)程到主進(jìn)程的異步通信同云。
ipcRenderer
是一個(gè) EventEmitter 的實(shí)例迎捺。 你可以使用它提供的一些方法從渲染進(jìn)程 (web 頁面) 發(fā)送同步或異步的消息到主進(jìn)程硝烂。 也可以接收主進(jìn)程回復(fù)的消息。
1.1 方法
ipcRenderer.send(channel, ...args)
通過channel向主進(jìn)程發(fā)送異步消息和簸,可以發(fā)送任意參數(shù)彭雾。
ipcRenderer.on(channel, listener)
-
channel
String -
listener
Function-
event
IpcRendererEvent -
...args
any[]
-
監(jiān)聽 channel
,當(dāng)接收到新的消息時(shí) listener
會以 listener(event, args...)
的形式被調(diào)用锁保。
二薯酝、ipcMain
從主進(jìn)程到渲染進(jìn)程的異步通信。
也可以從主進(jìn)程向渲染進(jìn)程發(fā)送消息爽柒,查閱ebContents.send獲取更多信息吴菠。
- 發(fā)送消息時(shí),事件名稱為
channel
浩村。 - 回復(fù)同步信息時(shí)做葵,需要設(shè)置
event.returnValue
。 - 可以使用
event.reply(...)
將異步消息發(fā)送回發(fā)送者心墅。 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[]
-
監(jiān)聽 channel
酿矢,當(dāng)接收到新的消息時(shí) listener
會以 listener(event, args...)
的形式被調(diào)用榨乎。
異步通信示例:
ipcRenderer 代碼:
import { ipcRenderer } from 'electron'
ipcRenderer.send('toMain', data) // 向主進(jìn)程發(fā)送消息
ipcRenderer.on('fromMain', (event, ...args) => func(...args)) // 監(jiān)聽
ipcMain 代碼:
import { ipcMain} from 'electron'
ipcMain.on('toMain', function (event, arg) { // 監(jiān)聽渲染進(jìn)程,傳遞的數(shù)據(jù)
// 邏輯處理
event.reply('fromMain', arg); // 返回給渲染進(jìn)程處理好的數(shù)據(jù)
});
同步通信示例:
ipcRenderer代碼
ipcRenderer.sendSync(channel, data)
ipcMain 代碼
ipcMain.on('syncGetLocalServer', function (event, arg) {
// 讀入文件瘫筐,同步返回?cái)?shù)據(jù)
fs.readFile("./localServer.xml", { encoding: "utf-8" }, (err, data) => {
event.returnValue=data; // 返回給渲染進(jìn)程
})
});