electron
  • 本节一共有 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

index.jsjs
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,试着同时多发几个任务,修改后的内容如下。
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。
package.jsonjson
{
  "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

正在载入评论…