Электрон - МПК меняет объект - PullRequest
0 голосов
/ 17 января 2019

В моем проекте Electron я пытаюсь сделать модуль одноэлементным, установив его как глобальный. Так как я использую jquery в этом модуле, я импортирую его в процесс рендеринга, а затем отправляю его на главную через ipc и устанавливаю там как глобальный. Вот связанная часть моего кода:

main.js:

ipcMain.on( "setGlobal", ( event, global_var) => {
  global[global_var[0]] = global_var[1];
  console.log(global_var);
  event.returnValue = 1;
} );

renderer.js:

const favourites = require("./components/favourites");

console.log(favourites);

ipcRenderer.sendSync("setGlobal", ["favourites", favourites]);

console.log(remote.getGlobal("favourites"));

Вывод console.log с в процессе рендеринга показан на рисунке ниже:

renderer output

А вывод основного процесса:

[ 'favourites', { favourites: [] } ]

Как видите, объект (модуль), который я отправил с ipcRenderer, изменился в ipcMain, он потерял свои функции add и init. У вас есть идеи, что является причиной такого поведения и как это исправить?

PS: Конечно, я протестировал его с простыми объектами, которые содержат функции вместо require("favourites"). Они также ведут себя так же. Я сделал обходной путь, используя только объекты как глобальные и передавая их всем функциям в качестве аргументов. Тем не менее, это не очень хороший способ чтения кода.

Ответы [ 2 ]

0 голосов
/ 17 января 2019

После ответа @ pergy я решил отказаться от IPC и использовать только глобальные переменные. Итак, вот обходной путь, который я нахожу:

основной процесс:

global.provider = {};

процесс рендеринга:

const favourites = require("./components/favourites");
remote.getGlobal("provider").favourites = favourites;

другие модули:

const favourites = remote.getGlobal("provider").favourites;
0 голосов
/ 17 января 2019

Вы не можете использовать IPC таким образом.Как отмечено в документации (например, sendSync)

Отправка сообщения главному процессу синхронно через канал, вы также можете отправлять произвольные аргументы.Аргументы будут сериализованы в JSON внутри, и, следовательно, никакие функции или цепочка прототипов не будут включены.

Ваши функции просто не переходят в основной процесс.


Для созданияВ модуле singleton вы должны просто использовать шаблон singleton в вашем модуле и использовать require в основном процессе и remote.require в рендерере.Поскольку требуется использование кэша (по крайней мере по умолчанию), тот же модуль должен быть возвращен.(более или менее. Хорошая статья об этом)

Например, если вы экспортируете класс:

let _instance = null
class MyClass {
  constructor() {
    if (_instance === null) _instance = this
    return _instance
  }
  ...
}
module.exports = MyClass
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...