【问题标题】:TypeError: window.require is not a function类型错误:window.require 不是函数
【发布时间】:2019-09-29 04:10:57
【问题描述】:

我正在尝试构建一个电子应用程序并想使用 window.require。不幸的是,编译器说“TypeError:window.require 不是函数”。具有讽刺意味的是,require在 main.js 中有效。

这是我试图运行的代码:

const electron = window.require('electron')
const low =  window.require('lowdb')
const FileSync = window.require('lowdb/adapters/FileSync')

我在另一篇文章中读到有人遇到了同样的问题,并通过将此代码添加到 .html 文件中解决了这个问题:

    <script type="text/javascript" src="../../../Gehaltseinstellungen_Hinzufügen.js">
        window.nodeRequire = require;
        delete window.require;
        delete window.exports;
        delete window.module;
    </script>

作者还说使用“nodeRequire”而不是 require 可以解决问题,但它并没有......

我读到的另一个选项是在激活渲染过程时 NodeIntegration 设置为 false,但我不知道如何在渲染时激活 Node。

【问题讨论】:

  • 我想补充一点,我突然遇到了同样的问题,无法弄清楚发生了什么。原来我有一个 iframe 和另一个 iframe 作为其 src 属性的值。虽然我不认为这个特定的细节非常相关,但它表明window.require() 本身不是问题。我希望这可以帮助其他正在处理这个问题的人。

标签: javascript node.js electron


【解决方案1】:

目前尚不清楚您使用的是哪个版本的Electron。您使用的语法是非标准的。

首先——如果您在BrowserWindows 中使用Electron 5.0、nodeIntegration is false by default,那么您需要在创建窗口时明确指定它:

mainWindow = new BrowserWindow({
  width: 800,
  height: 600,
  webPreferences: {
    nodeIntegration: true
  }
})

鉴于上述情况,以下语法可以正常工作(即不需要“窗口”引用):

const { ipcRenderer, remote } = require('electron');

【讨论】:

  • 赞成因为webPreferences 对象帮助我摆脱了错误,但我仍然需要前缀window
  • @BlueBot 确实,require('electron') 不起作用,但 window.require('electron') 很好
  • 爱你,我的意思是他们为什么不强调这一点!谢谢
  • 这是我的项目工作所缺少的要素。谢谢!
  • window.require('electron') 一起使用上述解决方案,但简单的require(electron) 导致另一个问题
【解决方案2】:

您可以像这样将 webPreferences.contextIsolation 设置为 false

    webPreferences: {
        nodeIntegration: true,
        contextIsolation: false
    }

它可能有效

【讨论】:

【解决方案3】:

需要所有 3 个这样的设置才能使这项工作:

webPreferences: {
  nodeIntegration: true,
  enableRemoteModule: true,
  contextIsolation: false,
},

注意:macbook m1,big sur 11.4,也许它必须对操作系统做一些事情,idk。

附:如 cmets 所述,在使用 nodeIntegration 之前 - 检查 Electron 文档以了解何时可能是安全问题:

不受信任内容的隔离 从不受信任的来源(例如远程服务器)接收代码和 在本地执行它。例如,考虑一个远程网站 显示在默认的 BrowserWindow 中。如果攻击者以某种方式 设法更改所述内容(通过攻击源 直接,或坐在您的应用程序和实际目的地之间), 他们将能够在用户的机器上执行本机代码。

⚠️ 在任何情况下都不应使用以下命令加载和执行远程代码 启用 Node.js 集成。相反,只使用本地文件(打包 连同您的应用程序)来执行 Node.js 代码。显示 远程内容,使用标签或 BrowserView,确保 禁用 nodeIntegration 并启用 contextIsolation。

来源:https://www.electronjs.org/docs/latest/tutorial/security#isolation-for-untrusted-content

【讨论】:

  • 我知道他们说不要评论说谢谢,但我只是花了过去 4 个小时来寻找如何解决这个问题,这就是解决方案!谢谢!
  • @PandaDev 我们都去过那里?很高兴它有帮助
  • nodeIntegration: true 存在安全风险electronjs.org/docs/latest/tutorial/…
  • @JuanSolano 如果您的上下文不受信任,是的,可能是。
  • @PandaDev,谁说不要说“谢谢”?因为谢谢你,我看到它对某人有用
【解决方案4】:

我在 Electron + Angular 中也遇到过这个问题。

  webPreferences: {
    nodeIntegration: true,
    contextIsolation: false
  }

上面的配置对我有用。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2016-02-26
  • 2013-04-01
  • 2016-03-06
  • 2018-04-28
  • 2019-02-14
  • 2021-10-02
  • 2021-10-30
相关资源
最近更新 更多