You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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给渲染进程:

  1. 新建preload.js文件
const { contextBridge, ipcRenderer } = require('electron')
// 把需要的IPC能力暴露给渲染进程的全局对象
contextBridge.exposeInMainWorld('electronAPI', {
    onResize: (callback) => ipcRenderer.on('resize', (_event, value) => callback(value))
})
  1. 修改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 // 保持开启更安全
    }
})
  1. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 09:15:02