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

Electron升级后启动报错Cannot read properties of undefined

问题原因

报错的核心是你的Electron主进程代码根本没有被主进程加载,反而被渲染进程/普通Node环境执行了,和whenReady写法、主进程文件存放路径没有关系:

  1. 你当前的启动命令是electron dist/,Electron 12+ 版本传入目录路径时,会优先读取目录下package.json的main字段定位主进程文件,找不到时不会默认加载同目录下的main.js,会直接把目录作为静态资源路径启动,导致你复制到dist下的main.js被当成渲染进程脚本加载。渲染进程环境下require('electron')导出的对象不包含主进程专属的app、BrowserWindow属性,自然会报读取undefined属性的错误。
  2. 你在普通Node终端执行require('./node_modules/electron')拿不到模块是正常现象:npm上的electron包本质是Electron可执行文件的安装器,导出值是可执行文件的本地路径,不是Electron的API模块,只有通过electron命令启动的主进程环境里,才能正确require到Electron的API对象。
  3. 你当前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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 21:01:02