Electron 主进程和渲染进程通信收不到消息怎么办?
我用 Electron 做了个小工具,主进程里监听了 ‘get-data’ 事件,但渲染进程发了消息后完全没反应,也没报错,不知道是哪一步写错了。
我在主进程里这样注册的监听:
ipcMain.handle('get-data', async () => {
return { message: 'Hello from main!' };
});
然后在渲染进程里用 preload 调用:
const result = await ipcRenderer.invoke('get-data');
console.log(result);
但控制台啥也没有,连错误都不报,是不是 invoke 和 handle 没对上?还是 preload 没配好?
Electron 12 之后 nodeIntegration 默认是关的,渲染进程里直接 require('electron') 会报错,必须通过 preload 暴露 API。
直接用这个完整的配置,一套带走。
先看 preload.js 怎么写:
然后主进程创建窗口的时候,preload 路径一定要配对:
渲染进程里调用方式要改,用 preload 暴露出来的方法:
注意几个坑:
第一,contextIsolation 必须开,这是默认值也是推荐值,别关。
第二,渲染进程里用
window.electronAPI.getData(),不是直接用ipcRenderer。第三,如果还是没反应,打开 DevTools 的 Console 看看有没有报 "require is not defined" 或者 "electronAPI is undefined" 之类的错。有这种错说明 preload 没加载成功,检查路径是不是对的。
调试的时候可以在 preload.js 最上面加个
console.log('preload loaded'),看控制台有没有输出,确认 preload 文件确实被执行了。