Я хочу использовать стандартную postMessage
функцию API в моих сценариях страницы, которые загружаются процессом рендеринга Electron.
Я хочу придерживаться веб-API в скриптах процесса рендеринга потому что приложение предназначено для работы как в Electron, так и в Интернете (в предпочтительном веб-браузере пользователя). Я не хочу облагать налогом читателей исходного кода, например if(typeof electron != "undefined") ...
или подобное.
Есть ли способ прослушивать сообщения, генерируемые функцией postMessage
, или события, отправляемые скриптом в основном сценарии процесса Electron? Это позволит мне сохранить изящный откат в сценарии процесса рендеринга - опубликованное сообщение, которое не обрабатывается, также не будет генерировать ошибки времени выполнения, если оно не запущено в Electron.
До сих пор я использовал preload
свойство объекта webPreferences
передается в BrowserWindow
конструктор для загрузки следующего сценария предварительной загрузки, который устанавливает «коммуникационный мост», который мне нужен:
(() => {
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 } }, "*")
как часть любого скрипта процесса рендеринга, и это в основном приведет к тому, что процесс рендеринга отправит сообщение основному процессу, при этом вышеуказанное будет настроено скриптом предварительной загрузки.
В идеале хотя, если возможно, я бы хотел избежать использования сценария предварительной загрузки, но, как я уже сказал, я вообще не хочу использовать какие-либо API-интерфейсы Electron в сценариях процесса рендеринга. Если бы я мог прослушивать сообщения, отправляемые «окном» сценария рендеринга, или отправляемые им события непосредственно в основном процессе, это избавило бы меня от необходимости в сценарии предварительной загрузки. Но я не знаю, возможно ли это, а чтение документации создает у меня впечатление, что я хожу по кругу или исчерпал свои альтернативы.