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暴露逻辑也不会执行。
解决方案
- 修正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 });
- 修正preload.js中的path导入语句:
将const { path } = require('path')替换为const path = require('path') - 验证效果:修改完成后重启应用,打开渲染进程的DevTools控制台,输入
window.api即可看到暴露的所有方法,调用也会正常返回结果。
内容的提问来源于stack exchange,提问作者dev
相关产品推荐
相关产品推荐

