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

Electron从11.x升级到12.x后contextBridge暴露的API在渲染进程为undefined

问题诱因
  • preload脚本配置位置错误:Electron所有和渲染进程web环境相关的配置都需要放在webPreferences字段下,你将preload直接写在BrowserWindow的根配置项中,导致preload脚本完全没有被加载,contextBridge.exposeInMainWorld的代码从未执行,自然访问window.api会返回undefined。这是Electron 12升级后最常见的适配问题,旧版本对根配置下的preload有兼容逻辑,12版本已移除该兼容。
  • preload.js中存在语法错误:你导入path模块的写法为const { path } = require('path'),属于错误的解构操作,path模块的默认导出就是完整的路径处理工具对象,不存在名为path的导出属性。该错误会导致preload脚本执行中断,即使preload被正确加载,后续的contextBridge暴露逻辑也不会执行。
解决方案
  1. 修正BrowserWindow的配置结构,将preload移入webPreferences,同时显式声明contextBridge需要的配套配置:
let win = new BrowserWindow({
    width: 550,
    height: 420,
    minWidth: 565,
    minHeight: 200,
    // 新增webPreferences配置块
    webPreferences: {
        preload: path.resolve(path.join(__dirname, 'app/preload.js')),
        contextIsolation: true, // contextBridge必须依赖该配置开启,Electron 12默认是true,显式声明更稳妥
        nodeIntegration: false // 关闭渲染进程node权限,符合安全规范,和contextBridge搭配使用
    },
    resizable: true,
    titleBarStyle: 'default',
    show: false
});
  1. 修正preload.js中的path导入语句:
    将const { path } = require('path')替换为const path = require('path')
  2. 验证效果:修改完成后重启应用,打开渲染进程的DevTools控制台,输入window.api即可看到暴露的所有方法,调用也会正常返回结果。

内容的提问来源于stack exchange,提问作者dev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 15:45:01