- 本节一共有 2 个 demo
- demos.1 的写法是存在一些问题的(需要理解 demos.1 的写法存在的问题)
- demos.2 对 demos.1 的问题进行了修复(需要理解 demos.2 是如何解决 demos.1 遇到的问题的)
- 类似于 demos.2 的效果,在工作中实践过,使用起来感觉没啥问题,还 OK。需要注意的是 channel 的语义化,如果 channel 的数量比较多,那么可以尝试通过一些特殊的自定义命名规则来区分哪些 channel 是用于在两个渲染进程之间互相通信的。当然,除了通过自定义命名规范来区分,还可以单独写一个全局对象来存储 channel,比如
CHANNEL_LIST.r2r.xxx、CHANNEL_LIST.r2m.xxx、CHANNEL_LIST.m2r.xxx。
1. 视频 - demos.1
2. demos.1
const { app, BrowserWindow, ipcMain } = require('electron')
let win1, win2
function createWin() {
win1 = new BrowserWindow({
webPreferences: { nodeIntegration: true, contextIsolation: false },
})
win2 = new BrowserWindow({
webPreferences: { nodeIntegration: true, contextIsolation: false },
})
win1.webContents.openDevTools()
win2.webContents.openDevTools()
win1.loadFile('./index1.html')
win2.loadFile('./index2.html')
}
function handleIPC() {
ipcMain.handle('message-from-renderer1', async (_, ...args) => {
console.log('main process received message from renderer1 with args:', args)
win2.webContents.send('message-to-renderer2', ...args)
return new Promise((resolve) =>
ipcMain.on('message-from-renderer2', (_, result) => resolve(result)),
)
})
}
app.whenReady().then(() => {
createWin()
handleIPC()
})- 通信原理图:
- 缺陷分析:
- 修改渲染进程
index1.html的脚本renderer1.2.js,试着同时多发几个任务,修改后的内容如下。
- 修改渲染进程
// renderer1.2.js
const { ipcRenderer } = require('electron')
async function test1() {
console.log(
'1 + 2 =',
await ipcRenderer.invoke('message-from-renderer1', 1, 2),
)
}
async function test2() {
console.log(
'1 + 2 + 3 =',
await ipcRenderer.invoke('message-from-renderer1', 1, 2, 3),
)
}
test1() // => 1 + 2 = 3
test2() // => 1 + 2 + 3 = 3 ❌3. 视频 - demos.2
4. demos.2
- 就 demos.1 中的问题,我们针对性地处理一下,解决方案也非常简单,给每一个任务加上 id,区分开不同的任务即可。
- 事先下载一个第三方包 uuid,用于生成任务的唯一 id。
{
"name": "renderer2renderer",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"dev": "electron ."
},
"author": "",
"license": "ISC",
"dependencies": {
"electron": "^29.1.0",
"uuid": "^9.0.1" // [!code highlight]
}
}通信原理图:
Discussions
正在载入评论…