我想在由Electron渲染器进程加载的页面脚本中使用标准的 postMessage
API函数。
我想在渲染器进程脚本中坚持使用Web API,因为该应用程序旨在在Electron和Web上运行(在用户首选的Web浏览器中)。我不想用if(typeof electron != "undefined") ...
或类似的代码对源代码阅读器征税。
在Electron主过程脚本中,是否有办法监听postMessage
函数生成的消息或脚本窗口调度的事件?这将使我能够在渲染器进程脚本中保持优美的后备状态-如果未在Electron中运行,则未处理的已发布消息也不会生成运行时错误。
到目前为止,我一直在使用 preload
property of the webPreferences
object being passed to BrowserWindow
constructor加载以下预加载脚本,该脚本设置了我所追求的“通信桥”:
(() => {
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。如果我可以直接在主流程中收听由渲染器脚本“窗口”发布的消息或由其分发的事件,则可以消除对预加载脚本的需求。但是我不知道是否可行,阅读文档给我的印象是我正在盘旋,或者我已经用尽了其他选择。
最佳答案
并非直接,但是您可以在浏览器窗口上预加载一个js片段,以便在渲染器进程上接收该消息,然后将其复制到ipcRenderer.send或调用
关于javascript - Electron 主流程脚本是否可以通过 `postMessage`函数监听页面发布的消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62051816/