【问题标题】:Electron.js 11.0.4 - BrowserWindow is not a contructorElectron.js 11.0.4 - BrowserWindow 不是构造函数
【发布时间】:2021-03-20 00:24:06
【问题描述】:

我正在处理this tutorial。根据文档,我稍微重新编写了代码以使其适合 Electron 11。最重要的是index.js文件如下:

const { BrowserWindow } = require('electron');
const path = require('path');


const notifyBtn = document.getElementById('notifyBtn');

notifyBtn.addEventListener('click', (event) => {

    const modalPath = path.join('file://', __dirname, 'add.html');

    let win = new BrowserWindow({
        width: 400,
        height: 200,
        webPreferences: {
            nodeIntegration: true,
            enableRemoteModule: true
        }
    });

    win.on('close', () => { win = null });
    win.loadURL(modalPath);
    win.show();
});

上面的代码检查是否点击了 index.html 文件中的按钮并创建了新的 BrowserWindow 放置 add.html 内容的位置。这是 index.html 代码:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <meta http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-inline';" />
    <link rel="stylesheet" href="../assets/css/main.css">
</head>
<body>
    <div class="row">
        <div id="price-container">
            <p class="subtext">Current BTC USD</p>
            <h1 id="price">Loading...</h1>
        </div>
        <div id="goal-container">
            <p><img src="../assets/img/up.png" alt=""><span id="targetPrice">Choose a Target Price</span></p>
        </div>
        <div id="right-container">
            <button id="notifyBtn">Notify me when...</button>
        </div>
    </div>

    <script src="index.js"></script>
</body>
</html>

当应用程序运行并尝试单击按钮时,我在 DevTools 控制台中收到以下错误:

Uncaught TypeError: BrowserWindow is not a constructor
 at HTMLButtonElement.<anonymous>

你能告诉我为什么会发生这个错误吗?我是电子的新人。提前感谢您的所有回答!

【问题讨论】:

  • 您的主脚本在节点上下文中运行,并打开 BrowserWindow,即 Chrome 实例。但是,您问题中的代码没有;它在浏览器内部运行。你为什么要尝试从第一个内部打开一个新的 Chrome 实例?如果这确实是您想要的,您必须向节点代码发送回一条消息并在那里打开 BrowserWindows。
  • 我不知道我是否对你有好处,但这不是 main.js 文件。 main.js 实际上与文档示例中的相同。上面的代码来自文件,该文件应该提供显示新 BrowserWindow(不是主应用程序 BrowserWindow)的事件。
  • 我知道,我假设您问题中的 JS 代码是由 &lt;script src="index.js"&gt;&lt;/script&gt; 加载的,对吗?这就是它不起作用的原因,请参阅here。据我所知,您正在尝试从Renderer 脚本运行Main 代码。同样,为什么要从第一个窗口中打开第二个窗口?因为这就是你想要做的。如果你想在点击按钮时导航到add.html,你只需要window.location = "add.html";
  • 老实说,我不知道为什么 add.html 应该作为另一个窗口打开 - 我正在阅读教程(链接在上面的问题中)和这就是本教程所包含的内容:D 但是我想将此功能设为新窗口,以便了解如何在将来使其变得更好。
  • 我也不知道,我认为你一开始也不想这样做,但这就是你的代码试图做的事情,因为我假设你只是复制了主要部分进入你的渲染器脚本而不理解为什么这不起作用(我也会冒险并声称教程没有告诉你这样做,但我不会看一个小时)。无论如何,下面的误导性答案确实教会了您如何从渲染器上下文向主上下文发送消息,所以我想这一切都解决了:)

标签: javascript electron


【解决方案1】:

通过调用new BrowserWindow() 创建新窗口通常是从主进程 完成的。在渲染器进程中,您需要使用remote API。

远程模块提供了一种简单的方法来进行进程间 渲染器进程(网页)和 主进程。

在 Electron 中,与 GUI 相关的模块(如对话框、菜单等)只有 在主进程中可用,而不是在渲染器进程中。为了 要从渲染器进程中使用它们,ipc 模块是必要的 向主进程发送进程间消息。用遥控器 模块,您可以调用主流程对象的方法,而无需 显式发送进程间消息,类似于 Java 的 RMI。

顺便说一句,您可以通过将其值记录到 DevTools 控制台来检查 BrowserWindow 确实是 undefined,因此不是构造函数:

const { BrowserWindow } = require('electron');
console.log (BrowserWindow); // -> undefined

所以,为了得到一个合适的 BrowserWindow 构造函数,你必须确实写:

const { BrowserWindow } = require('electron').remote;

【讨论】:

  • 感谢您的回答!是的,我尝试将其设为 const { BrowserWindow } = require('electron').remote;,但随后 DevTools 控制台抛出:Uncaught TypeError: Cannot destructure property 'BrowserWindow' of 'require(...).remote' as it is undefined
  • 这可能意味着,在您的 主进程(在 main.js 或等效项中),enableRemoteModule: true 尚未添加到传递给您对 @ 的调用的选项中987654330@ 创建应用的第一个主窗口...
  • 你是个天才!!!我在 main.js BrowserWindow 构造函数中添加了这个属性,现在一切正常。非常感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2021-11-28
  • 2020-08-12
  • 2013-12-25
  • 2021-01-11
  • 2015-12-04
  • 2018-11-29
  • 2016-12-04
  • 2020-12-27
相关资源
最近更新 更多