Nano Hash - криптовалюты, майнинг, программирование

Приложение Electron: ссылка на объект mainWindow в другом модуле?

Я создаю электронное приложение, в котором объект mainWindow создается после быстрого старта: http://electron.atom.io/docs/tutorial/quick-start/.

Согласно этому быстрому запуску, он создается асинхронно. Проблема, с которой я сталкиваюсь, заключается в том, что, например, когда я хочу отправить сообщения из основного процесса в процесс рендеринга, мне нужно сослаться на объект mainWindow. Если это произойдет в модуле, который мне нужен, то мне нужно средство, чтобы этот модуль знал об объекте mainWindow.

Я мог бы, конечно, добавить к нему global., но я знаю, что это очень не рекомендуется. Поэтому я хочу сделать это более элегантно.

Я наткнулся на этот пост: Асинхронный экспорт модуля nodejs; который, кажется, предлагает решение. Взяв файл main.js из быстрого запуска (см. ссылку выше, там это явно показано), кажется, я бы добавил в функцию createWindow

if( typeof callback === 'function' ){
  callback(mainWindow);
}

и экспортируйте модуль main.js как

module.exports = function(cb){
  if(typeof mainWindow !== 'undefined'){
    cb(mainWindow); 
  } else {
    callback = cb;
  }
}

Затем в сценарии более высокого уровня мне потребуется следующее:

let main = require('./main.js');
let lib = require('./lib.js');  // Library where I need a mainWindow reference
main(function(window) {
    lib.doSomething(window);
});

где lib.js выглядит

module.exports.doSomething = function(window) {
  // Do something with window object, like sending ipc messages to it
  window.webContents.send('hello-from-main', "hi!");
}

Хотя простой случай в исходном сообщении «Асинхронный экспорт модуля nodejs» работает нормально, я не могу заставить его работать, как описано выше; при запуске приложения оно жалуется Uncaught Exception: TypeError: Cannot read property 'webContents' of null. Это также имеет место, если я напрямую требую lib.js в обратном вызове main() (что, как я знаю, также не рекомендуется).

Признаюсь, я не совсем понимаю простой случай поста, так как я новичок в узле. Это не позволяет мне исправить мою собственную реализацию, что, я согласен, является тупым копированием/вставкой, которое, как разумно ожидать, потерпит неудачу. Может ли кто-нибудь помочь мне с тем, как исправить описанный выше метод, или посоветовать мне другой подход, чтобы заставить его работать? Благодарю вас!

01.11.2016

Ответы:


1

Для этого я создал пакет npm electron-main-window.

Установить:

$ npm install electron-main-window

or 

$ yarn add electron-main-window

Использование:

// Import ES6 way
import { getMainWindow } from 'electron-main-window';
const mainWindow = getMainWindow();

// Import ES5 way
const mainWindow = require('electron-main-window').getMainWindow();

// e.g:
if(mainWindow !== null ){
  mainWindow.webContents.send('mainWindowCommunication', "This is a test message");
}
05.02.2019
  • ES6 и ES2015 — это одно и то же. Вы имели в виду ES5. 11.05.2019
  • Я столкнулся с этой проблемой, и Google привел меня сюда. Попробовал ваш пакет, он отлично работает. Спасибо, Ганеш! 06.08.2019
  • Гуглил пару часов, ответа не нашел. Вы только что спасли мой день. Благодарю вас! 29.10.2020

  • 2

    Упс! Дьявол кроется в деталях... Я определил поверх main.js

    let mainWindow = null, callback;
    

    что вызвало ошибку! Должно быть

    let mainWindow, callback;
    

    тогда работает отлично!

    P.S. Вместо того, чтобы удалить свой пост, я решил оставить его и ответить себе на будущее для других людей, которым нужен асинхронный экспорт.

    01.11.2016
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..