Есть ли способ для сценария основного процесса Electron прослушивать сообщения, отправленные страницей с функцией postMessage? - PullRequest
1 голос
/ 27 мая 2020

Я хочу использовать стандартную 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 в сценариях процесса рендеринга. Если бы я мог прослушивать сообщения, отправляемые «окном» сценария рендеринга, или отправляемые им события непосредственно в основном процессе, это избавило бы меня от необходимости в сценарии предварительной загрузки. Но я не знаю, возможно ли это, а чтение документации создает у меня впечатление, что я хожу по кругу или исчерпал свои альтернативы.

1 Ответ

0 голосов
/ 28 мая 2020

не напрямую, но вы можете предварительно загрузить фрагмент js в окно браузера, которое получает это сообщение в процессе рендеринга, и скопировать его в ipcRenderer.send или вызвать

...