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)
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)
小智 10
创建新的浏览器窗口时,将nodeIntegration设置为true。
app.on('ready', () => {
mainWindow = new BrowserWindow({
webPreferences: {
nodeIntegration: true
}
});
});
Run Code Online (Sandbox Code Playgroud)
这篇文章的读者应该在做出决定之前阅读安全、本机功能和您的责任指南中的不要为远程内容启用 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)
你不应该设置contextIsolation: false.
如果您这样做,正如几个答案所建议的那样,那么您的代码肯定不会再因“ Uncaught ReferenceError: require is not Defined ”而失败。
但这只是因为您禁用了整个安全功能!
自 Electron 12 以来,上下文隔离一直默认开启,因为它是所有 Electron 应用程序的重要安全功能。如果您设置了contextIsolation: false,这就像打开您家前门的锁,以便您的家人可以进出,而不是向那些被允许进入的人提供钥匙。
相反,您应该设置contextIsolation: true(默认值)并使用预加载脚本来公开您的应用程序可能需要的任何模块的白名单包装器。您可以在上下文隔离链接中阅读有关它的更多信息,并且此 stackoverflow 答案中有一个详细的示例。
小智 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)