预检清单
- 我已阅读了此项目的 Contributing Guidelines。
- 我同意遵循此项目遵循的 Code of Conduct。
- 我在 issue tracker 中搜索了一个与我想提交的功能请求相匹配的功能请求,但没有成功。
问题描述
一段时间以来,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 转移一个 MessagePort
。MessageChannelMain
可以被弃用/移除。
只有一个 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 |
---|---|
端口可以转移到浏览器窗口 | 是 |
端口可以转移到工作线程 | 是 |
端口可以转移到子进程 | 否 |
3条答案
按热度按时间j9per5c41#
@sanking
8i9zcol22#
我猜通过一个contextBridge函数将MessageChannel的MessagePort转移到主线程是不可能的?
$x_1e^0f_1^x$
mbzjlibv3#
在ContextBridge上传输MessagePort不支持:
#27024
从预加载到主线程的MessagePort传输是支持的。
在ContextBridge上传输功能是支持的。
^ 仅为将来查看此内容的人澄清。