我正在使用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中的电子示例代码获得相同的结果。
答案 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
函数