这可能是假阴性。
我希望在应用程序启动时将测试注销到控制台,但事实并非如此。
console.log 调用的输出位置取决于进行这些调用的位置:
所以请确保您在正确的位置寻找预期的输出。
如果这不起作用,那么这里有一个关于如何在主进程和渲染器进程之间设置 IPC 通信的小演示。
main.js
您会注意到我确实将nodeIntegration 和contextIsolation 都设置为它们的默认值。这样做是为了明确您无需降低应用的安全栏即可允许在主进程和渲染器进程之间发送消息。
这是怎么回事?
主进程等待渲染器完成加载,然后发送“ping”消息。 IPC 通信将由预加载脚本处理。
注意console.log 调用,看看它在下面的截屏视频中出现的位置。
const {app, BrowserWindow} = require('electron'); // <-- v15
const path = require('path');
app.whenReady().then(() => {
const win = new BrowserWindow({
webPreferences: {
devTools: true,
preload: path.resolve(__dirname, 'preload.js'),
nodeIntegration: false, // <-- This is the default value
contextIsolation: true // <-- This is the default value
}
});
win.loadFile('index.html');
win.webContents.openDevTools();
win.webContents.on('did-finish-load', () => {
win.webContents.send('ping', '?');
});
// This will not show up in the Chrome DevTools Console
// This will show up in the terminal that launched the app
console.log('this is from the main thread');
});
preload.js
我们正在使用contextBridge API。这允许在不启用 nodeIntegration 或破坏上下文隔离的情况下向渲染器进程公开特权 API。
API 将在一个非常愚蠢的命名空间 (BURRITO) 下可用,以表明您可以更改它。
const { contextBridge, ipcRenderer } = require('electron');
contextBridge.exposeInMainWorld('BURRITO', {
whenPing: () => new Promise((res) => {
ipcRenderer.on('ping', (ev, data) => {
res(data);
});
})
});
renderer.js
使用预加载脚本提供的 API,我们开始监听 ping 消息。当我们得到它时,我们将主进程通信的数据放在渲染器页面中。我们还记录了一条消息,您可以在下面的截屏视频中看到。
BURRITO.whenPing().then(data => {
document.querySelector('div').textContent = data;
// This will show up in the Chrome DevTools Console
console.log(`this is the renderer thread, received ${data} from main thread`);
});
index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>IPC Demo</title>
</head>
<body>
<div></div>
<script src="./renderer.js"></script>
</body>
</html>
运行应用程序:
npx electron main.js
您可以看到两个console.log 调用在两个不同的地方产生了输出。