Electron.js window.require不是一个函数

时间:2019-05-22 22:51:30

标签: electron

我正在使用create-react-app(反应脚本v3.0.0)和electronicjs(v5.0.1)。我正在尝试使用'icpMain'模块as described here将事件从渲染器传递到主进程,但遇到错误window.require不是该行的功能

const { ipcRenderer } = window.require('electron');

如何在渲染器过程中使require进入全局范围?还是在主进程与渲染进程之间存在另一种通信方式?

编辑:

我已经尝试完全删除react build,并仅使用index.html中的电子示例代码获得相同的结果。

5 个答案:

答案 0 :(得分:14)

从 Electron 12 开始,contextIsolation 是默认启用的,这意味着除非 contextIsolation 为 false,否则不能在渲染器进程中使用 require(),此链接中的更多信息https://www.electronjs.org/docs/breaking-changes#default-changed-contextisolation-defaults-to-true

所以包括以下内容:

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

答案 1 :(得分:4)

确保 webpreferences 是这样的。

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

答案 2 :(得分:2)

似乎添加了首选项:

var mainWindow = new electron.BrowserWindow({
  ...
  webPreferences: {
    nodeIntegration: true,
  }
});

需要在渲染器过程中启用require

答案 3 :(得分:1)

实际上,您必须在BrowserWindow webPreferences中将nodeIntegration设置为true,因为版本5.0.0的nodeIntegration和webviewTag的默认值为false才能提高安全性。电子相关PR:16235

答案 4 :(得分:0)

我已解决此问题,将webPreferences:{ nodeIntegration: true,preload: '${__dirname}/preload.js}',添加到electron.js文件中,并将preload.js文件添加到您的目录中(我将/public目录添加到我的electron.js文件中存在)

electron.js

mainWindow = new BrowserWindow({
 title: 'Electron App',
 height: 650,
 width: 1140,
 webPreferences: { 
  nodeIntegration: true,
  preload: `${__dirname}/preload.js`,
  webSecurity: false 
 },
 show: false,
 frame: true,
 closeable: false,
 resizable: false,
 transparent: false,
 center: true,
});

ipcMain.on('asynchronous-message', (event, arg) => {
  console.log(arg); // prints "ping"
  event.reply('asynchronous-reply', 'pong');
});

preload.js

在preload.js文件中,只需添加以下行:

window.ipcRenderer = require('electron').ipcRenderer;

ReactComponent.js

在组件函数中编写以下代码,即: myTestHandle()

myTestHandle = () => {
  window.ipcRenderer.on('asynchronous-reply', (event, arg) => {
    console.log(arg); // prints "pong"
  });
  window.ipcRenderer.send('asynchronous-message', 'ping');
}
myTestHandle();

或在组件中的任意位置调用myTestHandle函数