有没有办法让 Electron 主进程脚本监听具有"postMessage"功能的页面发布的消息?



我想在由Electron渲染器进程加载的页面脚本中使用标准的postMessageAPI函数。

我想在渲染器进程脚本中坚持使用 Web API,因为该应用程序被设计为在 Electron 和 Web 上运行(在用户首选的 Web 浏览器中(。我不想用if(typeof electron != "undefined") ...或类似的方式对源代码阅读器征税。

有没有办法在 Electron 主进程脚本中侦听由postMessage函数生成的消息或脚本窗口调度的事件?这将允许我在渲染器进程脚本中保持优雅的回退 - 如果未在Electron中运行,则未处理的已发布消息也不会生成运行时错误。

到目前为止,我一直在使用传递给构造函数BrowserWindowwebPreferences对象的preload属性来加载以下预加载脚本,该脚本设置了我想要的"通信桥":

(() => {
const electron = require("electron");
addEventListener("message", ev => {
switch(ev.data.type) {
case "foobar":
electron.ipcRenderer.send("foobar", ev.data.foobar); break;
}
});
})();

然后,我可以将postMessage({ type: "foobar", foobar: { foo: 1, bar: true } }, "*")作为任何渲染器进程脚本的一部分,这基本上会导致渲染器进程将消息发送到主进程,上述设置由预加载脚本设置。

理想情况下,如果可能的话,我想避免使用预加载脚本,但就像我说的,我根本不想在渲染器进程脚本中使用任何 Electron API。如果我可以直接在主进程中收听渲染器脚本"window"发布的消息或它调度的事件,这将消除我对预加载脚本的需求。但我不知道这是否可能,阅读文档给我的印象是我在兜圈子,或者我已经用尽了我的替代方案。

不是直接的,但您可以在浏览器窗口上预加载一个脚本,该脚本在渲染器进程中接收该消息,并使用ipcRenderer.sendinvoke复制该脚本。

最新更新