remote.getGlobal() электрона возвращает undefined после window.location.replace()

Я возился с дистанционным модулем электрона. В моем основном процессе я создал эту переменную:

global.storage = {};

Мой процесс рендеринга инициализируется файлом с именем startup.html.

win.loadURL('file://' + __dirname + '/startup.html')

Туда я включаю файл javascript, содержащий следующую функцию:

function enterMain(value){
    remote.getGlobal('storage').exmpl = value;
    window.location.replace('./general.html');
}

Я передаю значение "привет", и при вызове...

console.log(remote.getGlobal('storage').exmpl);

... после присвоения значения он возвращает "привет", как и должно быть. Однако, как только расположение окна было заменено на general.html, в который я включил файл javascript, содержащий эту функцию:

$(document).ready(function(){
     console.log(remote.getGlobal('storage').exmpl);
});

... он возвращает undefined. Почему? Может ли кто-нибудь помочь мне понять это?


person Himmelslaub    schedule 23.10.2016    source источник


Ответы (1)


Здесь есть несколько вещей:

  • Модуль remote кэширует удаленные объекты в процессе визуализации при первом доступе.
  • Свойства, которые добавляются к удаленному объекту в процессе визуализации, не распространяются обратно на исходный объект в основном процессе.
  • Навигация перезапускает процесс визуализации.

Имея это в виду, вот что, вероятно, происходит в вашем коде:

  1. remote.getGlobal('storage') создает новый удаленный объект и кэширует его.
  2. remote.getGlobal('storage').exmpl = value добавляет новое свойство exmpl к удаленному объекту в кэше, но не распространяет его на исходный объект в основном процессе.
  3. window.location.replace('./general.html') перезапускает процесс визуализации, который сбрасывает кеш удаленных объектов.
  4. console.log(remote.getGlobal('storage').exmpl) создает новый удаленный объект, поскольку кеш пуст, но поскольку исходный объект в основном процессе не имеет свойства exmpl, он также undefined относится к новому удаленному объекту.

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

person Vadim Macagon    schedule 24.10.2016
comment
Понятно, есть ли способ сохранить переменную между переходами страниц, не полагаясь на сервер? - person Himmelslaub; 24.10.2016
comment
@Himmelslaub Если вы хотите сохранить состояние между страницами, сохраните его в основном процессе (как вы это делали), но используйте модули ipcRenderer и ipcMain для синхронизации состояния вместо модуля remote. - person Vadim Macagon; 24.10.2016
comment
Спасибо, я попробую это! - person Himmelslaub; 24.10.2016
comment
Спасибо за такой четкий ответ, @VadimMacagon! Простой пример того, как использовать ipcMain и ipcRenderer для установки значения глобальной переменной в процессе Main, можно найти в этом ответе: stackoverflow.com /a/52167197/293280 - person Joshua Pinter; 04.09.2018