抄袭我的答案:
https://stackoverflow.com/a/57656281/289203
-
是否可以在不启用节点集成的情况下使用IPC渲染器?
这是可能的,但很微妙。这可以通过使用
preload
脚本。
-
如果是,我该怎么做,为什么这么多资源会排除这些信息?
使用
预加载
脚本如下所示。然而,
这是
not considered secure
. 大多数现有文档都没有显示最佳安全实践。
// preload.js
const electron = require('electron');
process.once('loaded', () => {
global.ipcRenderer = electron.ipcRenderer;
});
// main.js
const {app, BrowserWindow} = require('electron');
app.on('ready', () => {
// Create the browser window.
win = new BrowserWindow({
backgroundColor: '#fff', // always set a bg color to enable font antialiasing!
webPreferences: {
preload: path.join(__dirname, './preload.js'),
nodeIntegration: false,
enableRemoteModule: false,
// contextIsolation: true,
// nativeWindowOpen: true,
// sandbox: true,
}
});
win.loadURL(`file://${path.join(__dirname, 'index.html')}`);
注意
预加载脚本的路径必须是绝对路径,这也可以
当使用webpack/babel时会变得复杂,因为输出文件可能是不同的路径。
-
contextIsolation
. 这将使上述方法无法使用,因为您不能再向全局范围添加数据。
最安全的建议是
addEventListener
和
postMessage
// preload.js
const { ipcRenderer } = require('electron');
process.once('loaded', () => {
window.addEventListener('message', event => {
// do something with custom event
const message = event.data;
if (message.myTypeField === 'my-custom-message') {
ipcRenderer.send('custom-message', message);
}
});
});
// main.js
const {app, ipcMain, BrowserWindow} = require('electron');
app.on('ready', () => {
ipcMain.on('message', (event, message) => {
console.log('got an IPC message', e, message);
});
// Create the browser window.
win = new BrowserWindow({
backgroundColor: '#fff', // always set a bg color to enable font antialiasing!
webPreferences: {
preload: path.join(__dirname, './preload.js'),
nodeIntegration: false,
enableRemoteModule: false,
contextIsolation: true,
sandbox: true,
// nativeWindowOpen: true,
}
});
win.loadURL(`file://${path.join(__dirname, 'index.html')}`);
// renderer.js
window.postMessage({
myTypeField: 'my-custom-message',
someData: 123,
});