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 没配好?
首先检查你的 preload 配置,要确保 webPreferences 里正确设置了 preload 路径:
然后在 preload.js 里要正确暴露 ipcRenderer 方法,标准写法是这样的:
渲染进程调用时要用 window.electronAPI:
常见踩坑点:
1. 没开 contextIsolation 导致 API 暴露不成功
2. preload 路径写错了(建议用 path.join)
3. 渲染进程直接用了 ipcRenderer(现代 Electron 必须通过 contextBridge)
4. 拼写错误(我就曾经把 invoke 写成 invok 卡了半天)
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 文件确实被执行了。