Electron升级后启动报错Cannot read properties of undefined
问题原因
报错的核心是你的Electron主进程代码根本没有被主进程加载,反而被渲染进程/普通Node环境执行了,和whenReady写法、主进程文件存放路径没有关系:
- 你当前的启动命令是
electron dist/,Electron 12+ 版本传入目录路径时,会优先读取目录下package.json的main字段定位主进程文件,找不到时不会默认加载同目录下的main.js,会直接把目录作为静态资源路径启动,导致你复制到dist下的main.js被当成渲染进程脚本加载。渲染进程环境下require('electron')导出的对象不包含主进程专属的app、BrowserWindow属性,自然会报读取undefined属性的错误。 - 你在普通Node终端执行
require('./node_modules/electron')拿不到模块是正常现象:npm上的electron包本质是Electron可执行文件的安装器,导出值是可执行文件的本地路径,不是Electron的API模块,只有通过electron命令启动的主进程环境里,才能正确require到Electron的API对象。 - 你当前package.json里声明的electron版本还是
^17.4.7,并没有真正升级到19版本。
修复步骤
- 修正启动命令,直接指定主进程文件路径,避免入口查找错误:
将package.json中scripts下的electron命令修改为:"electron": "npm run build-electron && ./node_modules/.bin/electron --no-sandbox dist/main.js" - 正确升级Electron到19版本,建议将Electron从dependencies移到devDependencies:
执行以下命令完成版本升级:npm uninstall electron npm install -D electron@19 - 修正主进程中
loadFile的路径写法,避免工作目录变化导致找不到页面:
在main.js顶部引入path模块,修改loadFile逻辑:const path = require('path') const { app, BrowserWindow } = require('electron') function createWindow() { let win = new BrowserWindow({ width: 800, height: 600, webPreferences: { nodeIntegration: true, contextIsolation: false }, }) // 替换原来的win.loadFile("index.html") win.loadFile(path.join(__dirname, "index.html")) } app.whenReady().then(createWindow) - (可选)如果希望保留传目录启动的写法,在
build-electron脚本中新增步骤,在dist目录下生成最简package.json指定入口:{ "name": "aurin-electron", "main": "main.js" }
注意事项
- 不要直接用
node dist/main.js启动主进程,必须通过electron可执行文件启动,否则永远无法正确加载Electron API。 - 升级后如果出现插件兼容性问题,优先检查原生node模块是否需要针对Electron 19的Node版本重新编译。
内容的提问来源于stack exchange,提问作者Michael Mitch
相关产品推荐
相关产品推荐

