Проблема с белым экраном в приложении Electron / Node

#node.js #electron #electron-packager

#node.js #electron #электронный упаковщик

Вопрос:

Недавно я создал приложение с серверной частью Java и интерфейсом React, и я использовал Electron и некоторые функции Node для объединения приложения и создания для него настольного приложения. В принципе, я решил использовать Java для некоторых библиотек, специфичных для Java, которые мне были нужны. Приложение будет работать на порту 8080, при этом материалы React / JS будут обслуживаться из статической папки, а оболочка Electron будет использовать некоторые библиотеки узлов для запуска процесса Java, а затем через несколько секунд подключится к localhost: 8080.

Это работает как шарм примерно в половине случаев, а другая половина вместо этого показывает мне белый экран без ошибок! Я отлаживал это бесчисленное количество раз, и единственный способ исправить это — принудительно перезагрузить страницу Chromium, которая иногда работает, а иногда нет. Очевидно, что это неприемлемо для пользователей в моем приложении. Проблема в том, что у меня закончились идеи относительно того, что может быть причиной этой проблемы.

Вот мой main.js для приложения electron

 const {app, BrowserWindow} = require('electron')

function createWindow () {
    try {
        var jarPath = './app.jar';
        var kill  = require('tree-kill');
        var child = require('child_process').spawn('java', ['-jar', jarPath, '']);
        let win = new BrowserWindow({width: 1000, height: 730});
        setTimeout(function() {
            win.loadURL('http://localhost:8080/index.html');
        }, 2000);
        console.log("PID: "   child.pid);
        win.on('closed', function () {
                kill(child.pid);
                mainWindow = null
            }
        )
    } catch(e) {
        console.log(e);
    }
}

app.on('ready', createWindow)
 

Комментарии:

1. Кажется излишне сложным для размещения на Java и обслуживания через electron (противоречит всей цели использования electron). Также использование setTimeout в производственном приложении для этой цели довольно грубо. Ваша ошибка, скорее всего, лежит именно там. Возможно, сервер Java еще не запущен, когда вы переходите к localhost. Может быть, прослушайте process.stdout ваше java-приложение для a ready и только затем перейдите на localhost, а не через тайм-аут