最初我一直使用电子稳定(4.x.x),并且能够在我的浏览器和渲染器过程中使用require
。我升级到电子beta(5.0.0),因为我需要更新版本的node,并且在渲染过程Uncaught ReferenceError: require is not defined
中遇到此错误消息。
在Google电子文档上进行搜索,发现有评论说该错误可能是由于初始化webPreferences.nodeIntegration
时将BrowserWindow
设置为false引起的;例如:new BrowserWindwo({width, height, webPreferences: {nodeIntegration: false}});
。但是我没有这样做,所以我认为还有其他问题,并继续寻求解决方案。
解决方案:
事实证明,nodeIntegration
在以前的电子版本中默认为true,但在5.0.0中默认为false。因此,将其设置为true解决了我的问题。找不到在评论或电子页面上在线记录的更改,我想我会做一个自我答复的SO帖子,以便将来遇到此问题的人更容易找到。
答案 0 :(得分:61)
对于 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`);
});
答案 1 :(得分:18)
事实证明,nodeIntegration
在以前的电子版本中默认为true,但在5.0.0中默认为false。因此,将其设置为true解决了我的问题。找不到在评论或电子页面上在线记录的更改,我想我会做一个自我答复的SO帖子,以便将来遇到此问题的人更容易找到。
答案 2 :(得分:10)
就像junvar所说的那样,nodeIntegration
现在在5.0.0中默认为false。
electronjs FAQ包含一些有关如何设置此值的示例代码:
let win = new BrowserWindow({
webPreferences: {
nodeIntegration: false
}
})
win.show()
答案 3 :(得分:10)
在创建新的浏览器窗口时将nodeIntegration设置为true。
app.on('ready', () => {
mainWindow = new BrowserWindow({
webPreferences: {
nodeIntegration: true
}
});
});
答案 4 :(得分:5)
junvar是正确的,
private bool AddToTransactionHistory(long checkingAccountNum, long savingAccountNum, decimal amount, int transTypeId, decimal transFee, IDbContextTransaction transaction)
{
bool ret = false;
try
{
using (transaction)
{
TransactionHistories transHist = new TransactionHistories
{
CheckingAccountNumber = checkingAccountNum,
SavingAccountNumber = savingAccountNum,
Amount = amount,
TransactionFee = transFee,
TransactionTypeId = (long)transTypeId,
};
_context.TransactionHistories.Add(transHist);
CacheAbstraction cabs = new CacheAbstraction();
cabs.Remove(CacheNameFacade.TRCACHENAME + ":" + checkingAccountNum); //the checking account is the same for each unique user
_context.SaveChanges();
ret = true;
return ret;
}
}
catch (Exception)
{
throw;
}
}
在v5.0.0中默认为false。
这是Release Notes for v5.0.0的nodeIntegration
部分的最后一条语句,并且在this PR
答案 5 :(得分:5)
假设电子 12.0.0
设置contextIsolation: false
在 main.js 中保留以下代码
new BrowserWindow({
width: 800, height: 600,
webPreferences: {
nodeIntegration: true,
contextIsolation: false,
enableRemoteModule: true,
}
})
答案 6 :(得分:5)
对于电子 13.0.0
webPreferences: {
nodeIntegration: true,
contextIsolation: false,
enableRemoteModule: true
}
答案 7 :(得分:3)
在contextIsolation: false
中添加webPreferences
答案 8 :(得分:1)
在做出决定之前,这篇文章的读者应该先阅读Do not enable Node.js Integration for Remote Content的Security, Native Capabilities, and Your Responsibility Guide部分。
// 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')
答案 9 :(得分:0)
答案 10 :(得分:-1)
添加nodeIntegration: true
并删除sandbox: true
:
mainWindow = new BrowserWindow({
webPreferences: {
nodeIntegration: true, // <---------- add this
// sandbox: true <------------ remove this
}
});