[功能请求]:将Node的原生MessageChannel API集成到Electron中

laximzn5  于 5个月前  发布在  Electron
关注(0)|答案(3)|浏览(83)

预检清单

问题描述

一段时间以来,Node 一直在使用 MessageChannel API。

const { port1, port2 } = new MessageChannel();
port1.on("message", (message) => console.log("received", message));
port2.postMessage({ foo: "bar" });

这个 API 与 Electron 的 MessageChannelMain 非常相似(如果不是完全相同的话),但是目前两者都有限制:
| 属性 | MessageChannel | MessageChannelMain |
| ------------ | ------------ | ------------ |
| 端口可以转移到浏览器窗口 | 否 | 是 |
| 端口可以转移到工作线程 | 是 | 否 |
| 端口可以转移到子进程 | 否 | 否 |

建议的解决方案

建议的解决方案是支持 Node 的原生 MessageChannel API,特别是能够从/到 Browser Windows 转移一个 MessagePortMessageChannelMain 可以被弃用/移除。
只有一个 API 将极大地简化 Electron 应用程序的开发:

// Main process
const { port1, port2 } = new MessageChannel()
w.webContents.postMessage('port', null, [port2])
const worker = new Worker("./worker.js");
worker.postMessage(port1, [port1]);

// Renderer process
const { ipcRenderer } = require('electron')
ipcRenderer.on('port', (e) => {
  const port2 = e.ports[0]
  port2.postMessage({ message: 'ping' }) // communicate directly with Worker Process
})

// Worker Process
port1.postMessage({ message: 'pong' })  // communicate directly with BrowserWindow
属性MessageChannel
端口可以转移到浏览器窗口
端口可以转移到工作线程
端口可以转移到子进程
8i9zcol2

8i9zcol22#

我猜通过一个contextBridge函数将MessageChannel的MessagePort转移到主线程是不可能的?

$x_1e^0f_1^x$

mbzjlibv

mbzjlibv3#

在ContextBridge上传输MessagePort不支持:
#27024
从预加载到主线程的MessagePort传输是支持的。
在ContextBridge上传输功能是支持的。
^ 仅为将来查看此内容的人澄清。

相关问题