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 时,应用没有自动重启,并出现报错,应用闪退了!截屏和报错信息如下:
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方法实现热更新)