Подтвердить что ты не робот

Когда использовать удаленный vs ipcRenderer, ipcMain

Я пытаюсь понять связь между основными и рендеринговыми процессами электронов. В документации https://github.com/electron/electron/blob/master/docs/api/remote.md указано, что "удаленный модуль обеспечивает простой способ взаимодействия между процессами (IPC) между процессом визуализации и основным процессом".

Однако документация очень скудная относительно того, как ее настроить.

Я могу получить примеры IPC для работы с моим приложением, которое кажется достаточно простым. В каких сценариях должен использоваться удаленный модуль?

4b9b3361

Ответ 1

Из remote docs:

В Electron, связанные с GUI модули (такие как диалог, меню и т.д.) доступны только в основном процессе, а не в процессе визуализации. Чтобы использовать их в процессе рендеринга, модуль ipc необходим для отправки сообщений межпроцессного процесса в основной процесс. С помощью удаленного модуля вы можете вызывать методы основного процесса объект без явной отправки сообщений между процессами, аналогичный Java RMI. Пример создания окна браузера из средства визуализации Процесс:

const remote = require('electron').remote;
const BrowserWindow = remote.BrowserWindow;

var win = new BrowserWindow({ width: 800, height: 600 });
win.loadURL('https://github.com');

В основном модуль remote позволяет легко делать материал, обычно ограниченный основным процессом в процессе рендеринга без большого количества ручных сообщений ipc взад и вперед.

Итак, в процессе рендеринга вместо:

const ipc = require('electron').ipcRenderer;
ipc.send('show-dialog', { msg: 'my message' });
ipc.on('dialog-shown', () => { /*do stuff*/ });

(И тогда в главном тексте нужно сделать материал в ответ на эти сообщения).

Вы можете просто сделать это все в рендерере:

const remote = require('electron').remote;
const dialog = remote.require('dialog')

dialog.showErrorBox('My message', 'hi.');

Модуль ipc явно не требуется (хотя это происходит для вас за кулисами). Не сказать, что эти два являются взаимоисключающими.

Еще один вопрос при использовании пульта. Можно ли получить доступ к функции, которая существует в основном процессе, а не в модуле?

Я думаю, что вы действительно спрашиваете: как я могу совместно использовать код между процессами main/renderer и как мне нужен модуль в рендерере?

EDIT: вы можете просто потребовать его, как обычно. Краевым случаем этого является то, что текущий URL-адрес окна рендеринга не указывает на локальный файл (не загружается с использованием файла://). Если вы загружаете удаленный URL-адрес, требуемый путь должен быть абсолютным, или вы можете использовать удаленный, как я сказал ниже.

OLD:

Это еще один вариант использования для remote. Например:

remote.require('./services/PowerMonitor.js')

Обратите внимание, что использование удаленного типа приводит к тому, что ваш код запускается в контексте основного процесса. Возможно, это будет полезно, но я буду осторожен.

Требуются встроенные модули node или electron, как обычно:

require('electron')
require('fs')

Можно ли получить доступ к глобальным переменным из средства визуализации?

Да.

//in main
global.test = 123;
//in renderer
remote.getGlobal('test') //=> 123