Electron开发中ipcRenderer.on()无法接收主进程IPC消息如何解决
问题原因
这个问题和M1芯片无关,是Electron默认安全配置限制和代码笔误共同导致的:
- 新版本Electron默认关闭
nodeIntegration,渲染进程无法直接调用Node.js API,你在script.js中require('electron')实际执行失败 - 默认开启
contextIsolation上下文隔离,渲染进程和Electron内部API运行在独立上下文,无法直接访问ipcRenderer - 你提供的app.js存在语法笔误:
new BrowserWindow的闭合括号写反了,应该是})不是) },会导致窗口初始化异常。
解决方案
方案1:快速适配(适合开发测试,生产环境不推荐)
修改app.js中BrowserWindow的配置,开启对应权限即可:
const win = new BrowserWindow({ width: 800, height: 600, // 新增webPreferences配置 webPreferences: { nodeIntegration: true, contextIsolation: false } })
修改完成后script.js中的require逻辑就能正常执行,监听到resize事件。
方案2:符合安全规范的生产级实现(推荐)
不关闭上下文隔离和Node集成,通过预加载脚本(preload)暴露API给渲染进程:
- 新建
preload.js文件
const { contextBridge, ipcRenderer } = require('electron') // 把需要的IPC能力暴露给渲染进程的全局对象 contextBridge.exposeInMainWorld('electronAPI', { onResize: (callback) => ipcRenderer.on('resize', (_event, value) => callback(value)) })
- 修改app.js的BrowserWindow配置,指定预加载脚本
const path = require('path') const win = new BrowserWindow({ width: 800, height: 600, webPreferences: { preload: path.join(__dirname, 'preload.js'), nodeIntegration: false, // 保持关闭更安全 contextIsolation: true // 保持开启更安全 } })
- 修改
script.js的监听逻辑,直接调用暴露的全局API
window.electronAPI.onResize((message) => { alert("Received!") })
额外检查项
如果修改后还是收不到事件,可确认窗口大小变化触发时页面已经完成加载,你可以把发送IPC的逻辑包裹在did-finish-load回调中,确保渲染进程的监听已经注册完成:
win.webContents.on('did-finish-load', () => { win.on("resized", () => { console.log("Window resized") win.webContents.send("resize", "window resized") }) })
内容的提问来源于stack exchange,提问作者Filippo Ansalone
相关产品推荐
相关产品推荐

