Шаблон проектирования для решения проблемы событий в приложениях Electron с ipcMain и ipcRenderer - PullRequest
0 голосов
/ 03 июля 2019

Поскольку в Electron есть два процесса, наш код javasript не является глобальным, поэтому я отправляю и получаю множество событий (с большим количеством разных имен), чтобы сделать то, что мы обычно делаем только с помощью обратного вызова в одном и том же методе.
Это еще хуже, если нам нужно использовать несколько глобальных переменных (например, глобальные константы).

Мой нынешний подход - попытаться управлять соединением между Main и Renderer как веб-сокет, но это не очень хорошо, и, возможно, я делаю это неправильно (также я чувствую, что попадаю в принцип DRY, потому чтоЯ не могу создать прослушиватель глобальных событий с помощью ipc, мне нужно жестко задавать имя события для каждого «send» и для каждого «on»).
Я управляю окнами (процесс Renderer) как View из MVC.
Может быть, я должен использовать основной процесс только для инициализации главного окна, а затем делать все (база данных, внешние вызовы API и т. Д.) Из нашего окна (рендерер)?(то есть MVC все в процессе Renderer и почти ничего не делают в главном процессе?)

Что такое хороший шаблон проектирования для решения этих двух процессов в Electron?

1 Ответ

2 голосов
/ 03 июля 2019

Это еще хуже, если нам нужно использовать глобальные переменные (например, глобальные константы).

Вы можете использовать глобальный объект

require('electron').remote.getGlobal('sharedObject').someProperty = 'new value'

Мне нужно жестко задавать имя события для каждого «отправки» и для каждого «вкл.»).

Не совсем шаблон проектирования, но мое решение для этого былоопределить функции «маршрутизации».

Renderer:

function sendMessageToMain(msg) {
    var arg;
    switch (msg) {  
        case "save-project":
            arg = { event: "save-project", sender: "editor", data: editorJson };

            break;
    }    
    ipcRenderer.send('app-message', arg);
 }

Main:

ipcMain.on('app-message', (event, arg) => {

    switch (arg.event) {
        case "save-project":
            global.model.data = arg.data;

            switch (arg.sender) {
                case "editor":
                    // do something
                    break;
                case "player":
                    // do something else
                    break;
            }
            break;
       }
}
...