Электрон показывает белый экран при сборке

Я изучаю электрон, и я сделал электронное приложение, которое читает и создает файлы. Когда я запускаю приложение с "npm start" или "электронным". работает как задумановы можете увидеть приложение здесь

но когда я использую команды "npm run build" или "build -w", созданное приложение просто показывает белый экран Что-то не так с моим кодом или что-то не так с командами, которые я использую?

Это мой package.json

 {
  "name": "prova",
  "version": "1.1.3",
  "description": "Prova electron",
  "main": "index.js",
  "scripts": {
    "start": "electron .",
    "dist" : "build"
  },
  "author": "Randy",
  "license": "ISC",
  "devDependencies": {
    "electron": "^2.0.2",
    "electron-packager": "^12.1.0"
  },
  "build": {
    "appId": "prova",
    "win":{
      "target" : "nsis",
      "icon" : "icon.ico"
    }
  }
}

Это моя главная страница js:

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

function boot(){
    win = new BrowserWindow()
    win.loadURL(url.format({
        pathname: 'index.html',
        slashes: true
    }))
}

app.on('ready', boot);

и есть моя страница функций js:

var app = require("electron").remote;
var dialog = app.dialog;
var fs = require("fs");
var i = 0;
var stringaLetta = "";

document.getElementById("bottone").onclick = function(){
    dialog.showSaveDialog((fileName) => {
        if(fileName === undefined){
            alert("errore")
            return
        }

        var content = document.getElementById("testo").value;

        fs.writeFile(fileName, content, (err) => {
            if (err == undefined) {
                dialog.showMessageBox({
                    message: "the file has been saved",
                    buttons: ["OK"]
                });
            }
            else dialog.showMessageBox({
                message: err
            })
        })
    })
}
document.getElementById("bottone2").onclick = function(){
    dialog.showOpenDialog((fileNames) => {
        if(fileNames === undefined){
            dialog.showMessageBox({
                message: "errore durante l'apertura",
                buttons: ["OK"]
            })
            return
        } else{
            readFile(fileNames[0]);
        }
    }) 
}

function readFile(fP){
    fs.readFile(fP, 'utf-8', (err, data) => {
        if(err){
            alert(err)
            return
        }
        var textArea = document.getElementById("rtesto")
        textArea.innerHTML = "";
        i = 0;
        do{
            if(data.charAt(i) == "\n"){
                stringaLetta += "<br\>";
            }else{
                stringaLetta += data.charAt(i);
            }
            i++;
        }while(data.charAt(i) != "")
        textArea.innerHTML = stringaLetta;
        stringaLetta = " ";
    })
}

9 ответов

У меня была похожая проблема, когда я пытался собрать для Windows.

В то время как win.loadURL(...) Кажется, что работает в процессе разработки, возможно, попытайтесь изменить это при сборке:

win.loadURL(url.format({
  pathname: path.join(__dirname, 'index.html'),
  protocol: 'file:',
  slashes: true
}));

Это гарантирует, что он определенно выберет правильный путь к вашему index.html файл.

Для path.join(...) работать надо require это первое:

const path = require('path');

Недавно я столкнулся с проблемой белого экрана, в моем случае небольшая разница

Я использовал фреймворк vue с маршрутизатором (маршрутизатор должен быть хеш-кодом)

1. для vue.js с маршрутизатором vue в электронном виде

const router = new VueRouter({
  mode: 'hash',
  routes: [...]
})

2. для react.js с реактивным маршрутизатором в электронном

hashrouter

вместо того

BrowserRouter

без каких-либо рамок

проверьте правильность размещения URL точки входа

 win.loadURL('app://./index.html')
 

В моем случае сборка также показала белый сайт. Для тех, кто использует React Router в своем проекте, это решение может быть полезно.

Моя переменная startUrl выглядит так:

const startUrl = process.env.ELECTRON_START_URL || url.format(
 {
    pathname: path.join(__dirname, '/../build/index.html'),
    protocol: 'file:',
    slashes: true
 });

Для меня решением было перейти от BrowserRouter к HashRouter в вашем App.jsкак упоминалось в этой теме

render() 
{
  return (
     <Provider store = { store }>
        <HashRouter>
           <Switch>
              <Route exact path='/' component={Home} />
              <Route exact path='/Login' component={Login} />
           </Switch>
        </HashRouter>
     </Provider>
  );
}

Я не знаю особенно о процессе сборки, у меня была такая же проблема при разработке, этот электрон не показывает ничего, кроме пустого экрана (вероятно, потому, что я щелкнул ссылку, которая была недоступна ранее).

После пересборки и чего еще на экране ничего не показывалось.

Последним приемом, который сработал для меня, было удаление моих Appdata из системы.

В моем случае у меня был Linux, я очистил данные приложения, перейдя в ~/.config/myApp

Окна: C:\Users\<user>\AppData\Roaming\<yourAppName>\Cache

OSX: /Users/<user>/Library/Application Support/<yourAppName>/Cache

Надеюсь, это поможет кому-то в нужде.

Возможно, вы использовали шаблон кода, в котором используются 2 варианта: один для режима разработки, а другой - для производства. По крайней мере, это была моя проблема, поэтому для режима разработки я использовал URL-адрес localhost, а в производстве он указывает на каталог сборки: вот так:

      const prodPath = format({
  pathname: resolve('renderer/out/start/index.html'),
  protocol: 'file:',
  slashes: true
})

Я думаю, что ваш индекс неверен для vue-router. Чтобы проверить это, вы можете поместить текст в свой App.vue. Если текст появляется, вы должны перенаправить на /

      // App.vue

<template>
    <div>
        <h1>Test</h1>
        <router-view />
    </div>
</template>


<script setup lang="ts">
import { onMounted } from 'vue';
import router from './router'

onMounted(() => {
    router.push('/')
})
</script>

У меня такая же проблема. Я думаю, что неправильно понимать, что электронное приложение будет упаковано в один файл .exe.

Я использовал шаблон electronic-react-boilerplate с GitHub. Если вы собираетесь упаковывать свое приложение, все, что он делает, — это создает каталог с вашим связанным кодом (шаблон electronic-react-boilerplate делает это за вас) и кучу других файлов со сгенерированным файлом .exe в release/build/ win-распакованный в папку релиза/сборки.

Что нужно сделать, чтобы заставить его работать:

Получите абсолютный код пути вашего файла index.html в файле release/app/dist/renderer/index.html (CODEWISE) (получите этот путь в файле main.ts/js)

Затем используйте этот URL-адрес файла в своемmainWindow.loadUrl()функция.

Тогда вы поймете, что вся папка релиза на самом деле является вашим приложением для распространения среди ваших клиентов.

проверьте, как вы установили заголовок для главного окна.

Я пытался использовать «process.env.npm_package_productName».

      mainWindow.setTitle(process.env.npm_package_productName);

отлично работает локально, но не работает при упаковке!

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

  1. В первую очередь забудьте про электронную папку, не трогайте ее.
  2. В вашем каталоге response /ion[введите описание изображения][1]ic, который является вашим корневым каталогом для приложения, добавьте в файл package.json следующее: "homepage": "./"

  3. Теперь из вашего каталога response /ionic, который является вашим корневым каталогом для приложения, перейдите в каталог "public" и обновите файл index.html, заменив его на:

  4. Теперь выполните следующую команду, и все... a. ionic build && npx cap copy b. npx крышка открытый электронenter code here

Другие вопросы по тегам