Electron初探:electron-reload 异常修复(2025-07-15)

209 阅读5分钟

electron-reload是一个插件,用于开发调试electron应用时实现热更新,也就是说,你不必每次更新程序后手动重启应用,它会帮你自动加载刷新,从而提高编程效率。今天安装使用了这个插件,碰到了问题,记录如下,希望对那些像我一样开始学习electron的同学有所帮助。

electron-reload github网址github.com/yan-foto/el…

electron-reload npm网址www.npmjs.com/package/ele…

官方文档简明扼要,插件使用非常简单(当然,后来我知道了,它还真的没那么简单,本以为5分钟搞定,结果前后花了我半天多)。

安装插件:

npm install electron-reload

调用插件(只能在主进程配置文件main.js中引用):

//仅自动刷新渲染进程,即更新html,相当于在浏览器中按F5,应用不会重启
const electronReload = require('electron-reload');

但是,这行官方代码其实并没有达到自动刷新效果,其实它没有任何可见的效果,经过摸索,我最后明白了,想让它起作用需要添加一行代码:

const electronReload = require('electron-reload');
electronReload(__dirname);

或者,直接一行代码搞定

const electronReload = require('electron-reload')(__dirname);
//或者
require('electron-reload')(__dirname);

官方代码会有如此大的纰漏吗?别急,大坑在后面......

如果我们希望主进程代码有变动时自动重启应用,可以这样写

const path = require('path')
//自动更新渲染进程和主进程,当主进程配置文件main.js有更改时,应用会重启
require('electron-reload')(__dirname, {
  electron: path.join(__dirname, 'node_modules', '.bin', 'electron')
});

但当我修改 main.js 时,应用没有自动重启,并出现报错,应用闪退了!截屏和报错信息如下:

局部截取_20250715_154915.png

A JavaScript error occurred in the main process Uncaught Exception:Error: spawn E:DevelectronAppslmy-electron-app\node modulesl.binlelectronENOENTat ChildProcess. handle.onexit (node:internal/child process:285:19)at onErrorNT(node:internal/child process:483:16)at process.processTicksAndRejections (node:internal/process/task queues:90:21)

electron基于nodejs,nodejs又基于V8引擎,其主进程抛出的Exceptions不像java或JavaScript的报错信息,往往会有比较明确具体的提示,比如哪个程序甚至某一行甚至某个关键字发生了某种错误,这种提示往往能让你在瞬间明了自己的错误所在,再不行通过搜索互联网也能很快找到答案,但这次完全不一样,错误信息可读性不强,只是提示好像缺了啥东西,只能继续gooooogle大法,希望能得到些许线索,但搜了半天没有什么用,搜索结果与这个插件基本无关……

继续,试试copilot:

**原因分析:**

-   这是因为 [electron-reload]() 在尝试用 [electron]() 启动 Electron 时,
找不到对应的可执行文件(ENOENT = No Entry,即文件不存在)。

-   可能原因有:

    1.  你的 [node_modules]() 目录下没有安装 [electron]()。
    2.  路径写错或被破坏。
    3.  Windows 下路径分隔符问题。

**解决办法:**

1.  **确保已安装 electron** 在项目根目录执行:

    npm install electron --save-dev
    
2.  **检查 electron 路径** 确认 [electron.cmd]() 文件存在。

3.  **修改 electron-reload 配置(推荐)**  Windows 下建议用 `.cmd` 结尾的可执行文件:

    // filepath: e:\Dev\electronApps\my-electron-app\main.js

    require('electron-reload')(__dirname, {
      electron: path.join(__dirname, 'node_modules', '.bin', 'electron.cmd')
    });

4.  **删除 node_modules 重新安装依赖(如仍有问题)**

    rm -rf node_modules

    npm install


**总结:**

-   主要是 electron 可执行文件路径问题,优先检查 node_modules 下 .bin 目录和 electron 安装情况,
并在 Windows 下用 `.cmd` 后缀。

你别说,copilot给的答案还真像那么回事,路径经验证没有问题。那就试试添加cmd后缀:

原来的写法:

require('electron-reload')(__dirname, {
    electron: path.join(__dirname, 'node_modules', '.bin', 'electron')
});

更新为copilot建议的写法:

require('electron-reload')(__dirname, {
  electron: path.join(__dirname, 'node_modules', '.bin', 'electron.cmd')
});

添加".cmd"后,异常终于消失了,修改html也自动刷新了,但......修改main.js后应用不会自动刷新重启!

还是不行啊.........................!!!!!!!!!!

一切都是按照官方标准文档来的,为什么就是不行呢?!!

再好好捋一捋思路:

第一,官方文档出错的概率很低,那么我本地环境与插件的匹配度问题出错的概率就大了;

第二,该插件最后更新时间在4年前,而这4年间nodejs、electron的版本肯定更新了很多东西,而这些累积的更新有可能造成环境与插件匹配问题;

第三,这个插件是copilot推荐给我的,使用该插件的开发人员应该不少,如果我搜相关热部署的技术文章应该能有所收获;

第四,实在不行先暂时放一下,换另外一个插件electronmon,也能实现类似的功能,等有闲工夫再研究electron-reload,做为程序员,执着坚韧是优良品质,但凡事别过头,过头了就成钻牛角尖了,必须考虑时间成本问题,曲线救国有时候就是最佳选择;

第一、第二条花费时间肯定不少,不走! 三四条可行,先拿半个小时看看别人是怎么部署的,其实们没有报什么希望,因为安装就一行代码,部署也是一行代码,有什么可研究的呢?!

但…………问题竟然真的出在这儿!!!

我肉眼爬了几十个网页,结果一篇文章中对路径的定义吸引了我,他跟别人都不一样,他是这样写的:

require('electron-reload')(__dirname, { 
    electron: require(`${__dirname}/node_modules/electron`) 
});

//官方文档是这样的:
require('electron-reload')(__dirname, {
    electron: path.join(__dirname, 'node_modules', '.bin', 'electron')
});

原文地址:《Electron 本地开发实现热重载的几种常见的方法》

看出区别了吗?我直接就拿来测试,结果一把通过!!!

问题解决了,但深层次的原因还没有彻底搞清楚,现在打印二者看看有何差异

console.log(require(`${__dirname}/node_modules/electron`));
//输出 E:\Dev\electronApps\my-electron-app\node_modules\electron\dist\electron.exe
console.log(path.join(__dirname, 'node_modules', '.bin', 'electron'));
//输出 E:\Dev\electronApps\my-electron-app\node_modules\.bin\electron

最终还是路径的问题!

那么新的问题来了:为什么官方代码提供了错误的路径呢?!!

备注本地测试环境:

Windows 10(1903)

Chrome (v136.0.7103.149),
Node.js (v22.15.1),
Electron (v36.4.0)

参考文献博文:

《Electron 本地开发实现热重载的几种常见的方法》
《Electron开发时热加载》(作者提供了gulp+electron-connect方法实现热更新)