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

时间:2019-03-11 00:10:18

标签: javascript node.js electron require

最初我一直使用电子稳定(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帖子,以便将来遇到此问题的人更容易找到。

11 个答案:

答案 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.0nodeIntegration部分的最后一条语句,并且在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 ContentSecurity, 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)

我使用电子版v4.1.4,每次我在应用程序上打开DevTools时都会发现这一点,这不像电子没有使我们疲惫不堪,只是为了表明阅读此类警告的重要性。

Screenshot-from-2019-06-04-09-27-38.png

答案 10 :(得分:-1)

添加nodeIntegration: true并删除sandbox: true

mainWindow = new BrowserWindow({
  webPreferences: {
    nodeIntegration: true, // <---------- add this
    // sandbox: true <------------ remove this
  }
});