电子5.0.0“未捕获的ReferenceError:需求未定义”

jun*_*var 31 javascript require node.js electron

我最初使用电子稳定(4.xx),并且能够require在我的浏览器和渲染器过程中使用。我升级到电子beta(5.0.0),因为我需要较新版本的node并在渲染器过程中遇到此错误消息Uncaught ReferenceError: require is not defined

谷歌浏览电子文档,我发现有评论说该错误可能是由webPreferences.nodeIntegration初始化BrowserWindow; 时设置为false 引起的。例如:new BrowserWindow({width, height, webPreferences: {nodeIntegration: false}});。但是我没有这样做,所以我认为还有其他问题,并继续寻求解决方案。

Vig*_*ran 73

对于 Electron 12 及以上版本

const electron = require("electron");

const { app, BrowserWindow } = electron;

app.on("ready", () => {
  const mainWindow = new BrowserWindow({
    width: 1000,
    height: 600,
    webPreferences: {
      nodeIntegration: true,
      contextIsolation: false,
      enableRemoteModule: true,
    },
  });
  mainWindow.loadURL(`file://${__dirname}/index.html`);
});
Run Code Online (Sandbox Code Playgroud)

  • webPreferences: { nodeIntegration: true, contextIsolation: false, enableRemoteModule: true, },这三行救了我的命,谢谢, (10认同)
  • `contextIsolation: false` 为我修复了它它只适用于旧版本,没有它 (2认同)
  • 设置“contextIsolation: false”仅起作用,因为它禁用了重要的安全功能。这不是 Electron 文档推荐的方法。相反,您应该使用预加载脚本来公开应用程序可能需要的任何模块的白名单包装器。我在回答中进一步解释了这一点。 (2认同)

jun*_*var 41

事实证明,nodeIntegration在以前的电子版本中默认为true,但在5.0.0中默认为false。因此,将其设置为true解决了我的问题。找不到在注释或电子页面上在线记录的更改,我想我会做一个自我答复的SO帖子,以便将来遇到此问题的人更容易找到。


小智 34

就像junvar所说的那样,nodeIntegration现在在5.0.0中默认为false。

electronjs FAQ有关于如何设置这个值一些示例代码:

let win = new BrowserWindow({
  webPreferences: {
    nodeIntegration: false
  }
})
win.show()
Run Code Online (Sandbox Code Playgroud)

  • 知道为什么当我将标志设置为 true 时这对我仍然不起作用,甚至尝试将 `const fs = require('fs')` 放在 renderer.js 文件以及我使用的 js 脚本文件中吗? (2认同)

小智 10

创建新的浏览器窗口时,将nodeIntegration设置为true。

app.on('ready', () => {
    mainWindow = new BrowserWindow({
        webPreferences: {
            nodeIntegration: true
        }
    });
});
Run Code Online (Sandbox Code Playgroud)


Sha*_*ber 9

这篇文章的读者应该在做出决定之前阅读安全、本机功能和您的责任指南中不要为远程内容启用 Node.js 集成部分。

// Bad
const mainWindow = new BrowserWindow({
  webPreferences: {
    nodeIntegration: true,
    nodeIntegrationInWorker: true
  }
})
mainWindow.loadURL('https://example.com')

// Good
const mainWindow = new BrowserWindow({
  webPreferences: {
    preload: path.join(app.getAppPath(), 'preload.js')
  }
})
mainWindow.loadURL('https://example.com')
Run Code Online (Sandbox Code Playgroud)


小智 7

加入contextIsolation: falsewebPreferences


Reg*_*dit 7

应该设置contextIsolation: false.

如果您这样做,正如几个答案所建议的那样,那么您的代码肯定不会再因“ Uncaught ReferenceError: require is not Defined ”而失败。

但这只是因为您禁用了整个安全功能! 自 Electron 12 以来,上下文隔离一直默认开启,因为它是所有 Electron 应用程序的重要安全功能。如果您设置了contextIsolation: false,这就像打开您家前门的锁,以便您的家人可以进出,而不是向那些被允许进入的人提供钥匙。

相反,您应该设置contextIsolation: true(默认值)并使用预加载脚本来公开您的应用程序可能需要的任何模块的白名单包装器。您可以在上下文隔离链接中阅读有关它的更多信息,并且此 stackoverflow 答案中有一个详细的示例。


dsp*_*ing 6

junvar是正确的,nodeIntegration在v5.0.0中默认为false。

这是v5.0.0发行说明Other Changes部分中的最后一个声明,并且在此PR中也提到了该声明。


小智 6

假设电子 12.0.0

contextIsolation: false

在 main.js 中保留以下代码

new BrowserWindow({
        width: 800, height: 600,
        webPreferences: {
            nodeIntegration: true,
            contextIsolation: false,
            enableRemoteModule: true,
          }
    })
Run Code Online (Sandbox Code Playgroud)


小智 5

对于电子 13.0.0

webPreferences: {
  nodeIntegration: true,
  contextIsolation: false,
  enableRemoteModule: true
}
Run Code Online (Sandbox Code Playgroud)