【问题标题】:Electron shows white screen when builtElectron 构建时显示白屏
【发布时间】:2018-11-28 06:05:41
【问题描述】:

我正在学习电子,我制作了一个电子应用程序来读取和创建文件。 当我使用 npm startelectron . 启动应用程序时,它会按预期工作:

但是当我使用npm run buildbuild -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 = " ";
    })
}

【问题讨论】:

    标签: javascript electron electron-builder electron-packager


    【解决方案1】:

    我在尝试为 windows 构建时遇到了类似的问题。

    虽然win.loadURL(...) 在开发中似乎可以这样工作,但也许在构建时尝试将其更改为:

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

    这可以确保它明确获得您的index.html文件的正确路径。

    要使path.join(...)url.format(...) 工作,您需要先require 他们:

    const path = require('path');
    const url = require('url');
    

    【讨论】:

    • 有效!您还必须包含const url = require('url');
    【解决方案2】:

    在我的情况下,我最近遇到了白屏问题

    我用vue框架和路由器(路由器必须是hash)

    1.for vue.js 在电子中使用 vue 路由器

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

    2.for react.js with react router in electron

    hashrouter
    

    而不是

    BrowserRouter
    

    没有任何框架

    检查入口点 url 放置是否正确

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

    【讨论】:

      【解决方案3】:

      在我的情况下,构建也显示了一个白色站点。对于那些在他们的项目中使用 React Router 的人来说,这个解决方案可能会有所帮助。

      我的 startUrl 变量如下所示:

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

      对我来说,解决方案是在App.js 中从BrowserRouter 移动到HashRouter,如in this thread 所述

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

      【讨论】:

        【解决方案4】:

        我不知道特别是构建过程,我在开发时也遇到了同样的问题,电子只显示一个空白屏幕(可能是因为我点击了一个之前不可用的链接)。

        重建后,屏幕上什么也没有显示。

        对我有用的最后一个技巧是 从系统中清除我的 Appdata。

        就我而言,我有 linux,我通过转到 ~/.config/myApp 清除了应用数据

        Windows:C:\Users\&lt;user&gt;\AppData\Roaming\&lt;yourAppName&gt;\Cache

        OSX:/Users/&lt;user&gt;/Library/Application Support/&lt;yourAppName&gt;/Cache

        希望对有需要的人有所帮助。

        【讨论】:

          【解决方案5】:

          也许您使用了一个包含 2 个案例的代码模板, 一种用于开发模式,一种用于生产。至少那是我的问题,所以对于开发模式,我曾经使用 localhost 的 URL,而在生产中,它指向构建目录:就像这样:

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

          【讨论】:

            【解决方案6】:

            注意:要使用电子启动应用程序,请按照以下步骤操作:(请原谅我 英语我是法语母语者)

            1. 首先忘记电子文件夹,不要碰它。

            2. 在您的 react/ion 目录中,即您的应用程序根目录,在您的 package.json 文件中添加以下内容:"homepage": "./"

            3. 现在从作为应用根目录的 react/ionic 目录导航到“public”目录并更新 index.html 文件,将 &lt;base href="/" /&gt; 替换为:&lt;base href="./" /&gt;

            4. 现在运行以下命令,就是这样......

              • ionic build &amp;&amp; npx cap copy
              • npx cap open electron

            【讨论】:

            • 抱歉,这仅适用于 ionic
            猜你喜欢
            • 2021-07-16
            • 2021-02-17
            • 2021-09-09
            • 1970-01-01
            • 2023-02-23
            • 1970-01-01
            • 1970-01-01
            • 2020-11-10
            • 2022-01-23
            相关资源
            最近更新 更多