常见问题
# 常见问题
这里总结了开发时遇到的常见问题,方便开发者快速找到解决方案。
如果没有找到,还可以查查issue
# 1:打包时,下载资源超时
# 使用国内源,参见 安装 或 生成软件 教程
# 2:打包失败(异常)
错误1:python 。。。。。
解决:升级构建包,npm install electron-builder@23.0.6
错误2:打包报错Fatal error: Unable to commit changes
原因:
1. 磁盘是不是满了 ,这个坑也困扰了我半个小时,虽然不长,但是是低级错误
2. 杀毒软件,我把电脑管家关了就好了,还有mcfee,麦克非那个杀毒等等。
3. 使用makensis包时,账户名为中文,构建异常。
解决:
1. 清理磁盘
2. 退出杀毒软件
3. https://www.azimiao.com/6250.html
错误3:...resource\app.asar does not exist ...
解决:electron-egg/目录中,如果有app目录,则该目录必须是个普通文件目录,不能为项目目录,
比如,app/目录内,不能有 .git、 package.json、node_modules等文件。
错误4:...Need executable 'ar' to convert dir to deb
原因:fpm 工具需要 ar 命令才能打包deb, 安装binutils
解决:sudo apt install binutils
错误5:...Cannot find module 'fs/promises'
原因:electron-builder包版本太高,一些语法不兼容
解决:降低electron-builder版本,重新安装包:electron-builder <= 22.10.5
错误6:...ERR! better-sqlite@7.6.2 install ...
原因:sqlite需要更高版本的node.js
解决:更新node.js >= 14.21.1
错误7:... errorOUt=/home/hzx/.cache/electron-builder/fpm/fpm-1.9.3-2.3.1-linux-x86/lib/ruby/bin/ruby ...
原因:fpm没有相匹配的arm包,所以会去下载仓库中有的包!
解决:本地安装ruby并配置中国数据源,重新下载fpm包,最后使用软连接的方式链接fpm,重新执行打包命令该问题可解决)
sudo apt-get install ruby-full
gem sources --add https://gems.ruby-china.com/ --remove https://rubygems.org/
gem sources -l
sudo gem install fpm
cd ~/.cache/electron-builder/fpm/fpm-1.9.3-2.3.1-linux-X86_64/ #版本有可能不同,根据实际情况更改
rm -rf fpm
ln -s /usr/local/bin/fpm fpm
# 3:打包后,运行闪退 或 报错
闪退
# 开发模式正常,打包后运行闪退
1. 查看日志中是否有报错
2. 在cmd中运行程序,可看到打包后的程序运行是否有异常错误(日志中没有的)
如:d:/soft/electron-egg.exe 按“回车”
报错1:代码被过滤
A JavaScript error occurred in the main process
Uncaught Exception:
AssertionError [ERR ASSERTION]: Directory C:\Program Files\ee\resources\app.asar\electron not exists
at new EeCore (C:\Program Files\ee\resources\app.asar\node_modules\ee-core\core\lib\ee.js:26:5)
at new BaseApp (C:\Program Files\ee\resources\app.asar\node_modules\ee-core\lib\baseApp.js:16:5)
at new EeApp (C:\Program Files\ee\resources\app.asar\node_modules\ee-core\lib\eeApp.js:12:5)
at new Appliaction (C:\Program Files\ee\resources\app.asar\node_modules\ee-core\lib\application.js:67:5)
at new Main (C:\Program Files\ee\resources\app.asar\main.js:6:5)
at Object.<anonymous> (C:\Program Files\ee\resources\app.asar\main.js:48:1)
at Module. compile (internal/modules/cjs/loader.js:1078:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1108:10)
at Module.load (internal/modules/cjs/loader.js:935:32)
at Modulejoad (internal/modules/cjs/loader.js:776:14)
提示: ./app.asar/electron not exits
原因:未使用加密功能,但是把源码过滤了,导致找不到代码。
处理:请查看 代码加密文档
报错2:bytecode加密时,代码不规范
A JavaScript error occurred in the main process
Uncaught Exception:
TypeError:Class constructor ExampleService cannot be invoked without new
at getExports(C:Program Files ee resources app.asarnode modules ee-core core liblloader\file.loader..:15)
at ContextLoader.parse(C:Program Files ee resources app asarnode modules ee-core core liblloader\file.loader..:23)
at ContextLoader.load C:\Program Filesleeresources app.asarnode modules ee-core coreiblloader\file loader....:24)
at AppLoader.loadToContext(C:Program Files eeresources app.asarnode modules ee-core coreliblloader'ee loader.j..:28)
at AppLoader.loadService(C:Prog am Files eeresources app.asarnode modules ee-core corelib\loader\mixin){servi..:10)
at AppLoader.load(C\Program Files ee resources\app.asar)node modules ee-core ib\appLoaderjs:26:10)
at new BaseApp(C:\Program Fileseeresources app.asar node modules ee-core ib baseApp.js:28:17)
at new EeApp(C\Program Files ee resources app.asarnode modules ee-core ib eeApp.js:12:5)
at new Appliaction(C:\Program Fileslee resources app.asar node modules ee-core lib\applicationjs:67:5)
at new Main(C:\Program Files eeresources app.asarmain.js:6:5)
显示 TypeError Class constructor ExampleService cannot be invoked withou 'new' at ......
原因:每个加密的class文件,需要添加 toString() 方法
处理:请查看 代码加密文档 中 代码要求
报错3:bytecode、strict 加密,要区分系统;比如window-64只能构建64软件,不能构建32位 如下图,用win64构建的32位软件,是无法运行的。
A JavaScript error occurred in the main process
Uncaught Exception:
Error:[egg-core] load file:C:\Program Fileslee\resources\app.asar\public\electron\config config.defaultjsc,
error:Invalid Or incompatible cached data(cachedDataRejected)
at Object.Module.extensions. <computed>[as .jsc](C\Program Filesleelresourceslapp.asar\node.modules\bytenode\lib\indexjs:272:11)
at Module.load(internal/modules/cjs/loaderjs:935:32)
at Module.load(internal/modules/cjs/loaderjs:776:14)
at Function.f.load(electron/js2c/asar bundlejs:5:12913)
at Module.require (internal/modules/cjs/loaderjs:959:19)
at require(internal/modules/cjs/Herpers.js:88:18)
at Object.loadFile(C:Program Fileslee\resources\app.asarlnode moduleslee-corelcore\lib\utils\indexjs:29:19)
at AppLoader.requireFile(C:Program Filesleelresourceslapp.asarlnode moduleslee-corelcoreliblloaderlee loaderj.:23)
at AppLoaderloadFile(C:\Program
报错4:windows防火墙,授权electron应用访问网络 可能需要重启电脑
A JavaScript error occurred in the main process
Uncaught Exception:
Error: net::ERR CONNECTION REFUSED at SimpleURLLoaderWrapper.<anonymous> (electron/js2c/browser init.js:105:7068)
报错5:加密模块报错
原因:bytenode对electron的版本支持差异化
处理:请调整electron版本,或 bytenode版本
A JavaScript error occurred in the main process
Uncaught Exception:
Error: Cannot find module xxx
Require stack:
- xxxx/node_module/bytenode/lib/index.js
报错6:模块未找到
Uncaught Exception:
Error Cannot find module 'semver'
- xxx ....../resources/app.asar/.../index.js
原因:使用了非官方的包管理,如:yarn cnpm等
解决方案: 请使用npm
# 4:cmd控制台乱码
# 5:npm包缺失或异常
安装异常时,删掉node_modules和package-lock文件
# 1、如:cannot find module 'debug'
解决:npm install debug --save
# 2、npm install安装异常时
删掉 package-lock.json
删掉 node_modules文件夹
重新执行 npm install 或 cnpm install
# 备注
包问题,都用npm安装,不要用cnpm、pnpm、yarn
# 6:白屏
# dev模式白屏
问题1:先启动前端服务,再启动桌面服务,请查看文档中开发步骤
# 打包后白屏
可能原因1:前端路由
前端项目路由是history,改成 hash 。
可能原因2:代码不生效
如果执行过加密,则会生成加密代码:/public/electron ,框架优先读取它,源代码则不生效。
如果发现编写的代码不生效,请记得删除加密代码文件。
知识点:为什么不能使用代理? (opens new window)
# 7:安装 better-sqlite3 失败
不同node.js版本,对应的better-sqlite3版本也不尽相同。请尝试 npm i better-sqlite3@7.6.0
# error 1
......
env: python: No such file or directory
make: *** [Release/sqlite3.a] Error 127
rm ba23eeee118cd63e16015df367567cb043fed872.intermediate
gyp ERR! build error
gyp ERR! stack Error: `make` failed with exit code: 2
gyp ERR! stack at ChildProcess.onExit (/Users/apple/.nvm/versions/node/v14.16.0/lib/node_modules/npm/node_modules/node-gyp/lib/build.js:194:23)
......
# 原因
需要python环境,(MacOS高版本,不再提供默认python)
# 解决方案
如Mac系统(其它系统请自己百度Python安装方法)
1. brew install python@3.9
2. vim ~/.zshrc 添加
# python
alias python='/usr/local/bin/python3'
export PATH="/usr/local/opt/python@3.9/libexec/bin:$PATH"
3. source ~/.zshrc
# error 2
......
gyp ERR! build error
gyp ERR! stack Error: `C:\Program Files (x86)\MSBuild\14.0\bin\MSBuild.exe` failed with exit code: 1
gyp ERR! stack at ChildProcess.onExit (C:\nvm\v14.16.0\node_modules\npm\node_modules\node-gyp\lib\build.js:194:23)
gyp ERR! stack at ChildProcess.emit (events.js:315:20)
gyp ERR! stack at Process.ChildProcess._handle.onexit (internal/child_process.js:277:12)
gyp ERR! System Windows_NT 10.0.19041
gyp ERR! command "C:\\Program Files\\nodejs\\node.exe" "C:\\nvm\\v14.16.0\\node_modules\\npm\\node_modules\\node-gyp\\bin\\node-gyp.js" "rebuild" "--release"
gyp ERR! cwd D:\www\xing\oschina-desktop\node_modules\better-sqlite3
......
# 原因
需要node-gyp工具
# 解决方案
执行命令:npm i node-gyp -g
# 错误3
......
was compiled against a different Node.js version using
NODE_MODULE_VERSION 83. This version of Node.js requires
NODE_MODULE_VERSION 89. Please try re-compiling or re-installing
......
# 原因
sqlite包是用c\c++写的,下载的可执行程序可能与你的操作系统不一致,因此需要根据源代码重新构建。
# 解决方案
执行命令:npm run re-sqlite
# 错误4
......
Error: node-gyp failed to reuild ......electron-edge-js
Error: ...BuildTools\MSBuild\15.0\Bin\...
......
# 原因
缺少微软构建工具
# 解决方案
执行命令:npm --vs2015 i -g --production windows-build-tools
# 其它错误
查看 better-sqlite3 文档(Troubleshooting installation)
https://github.com/WiseLibs/better-sqlite3/blob/2194095aa1183e9c21d28eafadeac0d4d4d42625/docs/troubleshooting.md
# 8:在浏览器中打开vue启动的服务地址(http://localhost:8080)报错
错误:Uncaught TypeError: window.require is not a function......
原因:vue项目中有个demo功能需要访问electron模块,在普通浏览器中是不能解析的。
处理:尽量在electron启动的窗口中调试前端页面吧。
# 10:node module版本不匹配
# 错误
......
was compiled against a different Node.js version using
NODE_MODULE_VERSION 83. This version of Node.js requires
NODE_MODULE_VERSION 89. Please try re-compiling or re-installing
......
# 原因
一些npm包是用c\c++等其它语言写的,下载的可执行程序可能与你的操作系统不一致,因此需要根据源代码重新构建。
# 解决方案
electron-rebuild -f -w 模块名
# 11:macOS系统下,自动更新失败
// 尝试关闭asar功能
1. 检查确认苹果签名账号
2. 修改package.json中,build对象asar属性值为false
3. 使用代码加密功能,以防源码暴露
# 12:软件黑屏或者卡死
错误: ... ERROR:gpu_memory_buffer_support_x11.cc......
原因:win7或者Linux系统,不支持gpu加速
处理:在main.js文件的ready()方法中关闭硬件加速
伪代码:
const isWin7 = os.release().startsWith('6.1');
const isLinux = true;
if (isWin7 || isLinux) {
app.disableHardwareAcceleration();
}
# 14:代码不生效
如果执行过加密,则会生成加密代码:/public/electron ,框架优先读取它,源代码则不生效。 如果发现编写的代码不生效,请记得删除加密代码文件。
# 15:无法识别的class
A JavaScript error occurred in the main process
Uncaught Exception:
TypeError:Class extends value undefined is not constructor or null
at Object.anonymous> (C:\Users\Administrator)Desktop e lectron areatool web client\mainjs:3:20)
at Module compile(internal/modules/cjs/loaderjs:1078:30)
at Object.Module extensions..js(interna/modules/cjs/loaderjs:108:10)
at Module.load(interna l/modules/cjs/loaderjs:935:32)
at Module.load(internal/modules/cjs/loader.js:776:14)
at Function.f.load(e ectron/js2c/asa bundlejs:5:12913)
at oadApplicationPackage(C:\Users\Administrator Desktop\electron areatoc web_client\node modules e...:6
at Object.<anonymous:(C:}Usersv Administrator\Deskto p ctron areatoo web client\node modules el...:9)
at Module.compile(internal/modules/cjs/oaderjs:1078:30)
at Object.Module extensions.js(interna l/modules/cjs/loaderjs:1108:10)
旧的ee-core包提供的api,单词拼写有误 Application
const { Appliaction } = require('ee-core');
# 修改为:
const { Application } = require('ee-core');
const EE = require('ee-core/ee');
class Main extends Application {
......
}
EE.app = new Main();
# 16:无法使用某些 electron 的api
electron的一些api有引入顺序要求,请将它们放在合适的位置。 比如:
2023-05-11 18:31:01,546 ERROR 77836 nodejs.unhandledExceptionError: [ee-core] load file:
error: Cannot create BrowserWindow before app is ready
at Object.createWindow (D:\www\xing\electron-egg\node_modules\ee-core\electron\window.js:21:15)
at Object.getMainWindow (D:\www\xing\electron-egg\node_modules\ee-core\electron\index.js:11:35)
at Object.get mainWindow [as mainWindow] (D:\www\xing\electron-egg\node_modules\ee-core\electron\index.js:21:17)
at Object.<anonymous> (D:\www\xing\electron-egg\electron\service\os.js:5:9)
at Module._compile (internal/modules/cjs/loader.js:1078:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1108:10)
at Module.load (internal/modules/cjs/loader.js:935:32)
at Module._load (internal/modules/cjs/loader.js:776:14)
at Function.f._load (electron/js2c/asar_bundle.js:5:12913)
at Module.require (internal/modules/cjs/loader.js:959:19)
解决方案:
# 不要直接导出模块中某个对象,因为项目启动时,框架源码可能并没有加载完。
# 错误写法
const { mainWindow } = require('ee-core/electron');
const { logger } = require('ee-core/electron');
# 正确写法
const Electron = require('ee-core/electron');
const Log = require('ee-core/log');
# 17:双击exe无反应
代码被过滤,请仔细阅读:构建文档
# 18:双击exe报错
D:\test\electron\electron-egg\out\win-unpacked>
D:\test\electron\electron-egg\out\win-unpacked\resources\app.asar\node_modules\ee-core\log\logger.js:38
logger: sysConfig.logger,
^
TypeError: Cannot read property 'logger' of undefined
at Object.create (D:\test\electron\electron-egg\out\win-unpacked\resources\app.asar\node_modules\ee-core\log\logger.js:38:27)
at Object.get coreLogger [as coreLogger] (D:\test\electron\electron-egg\out\win-unpacked\resources\app.asar\node_modules\ee-core\log\index.js:30:32)
at process. (D:\test\electron\electron-egg\out\win-unpacked\resources\app.asar\node_modules\ee-core\exception\index.js:26:9)
at process.emit (events.js:327:22)
at process._fatalException (internal/process/execution.js:163:25)
# 情况一
# 这种是临时文件,无法使用,忽略它。
临时文件:out/win-unpacked
# 情况二
代码被过滤了,请仔细阅读:构建文档
# 19:运行rd,encrypt ,clean命令时报错
env: node\r: No such file or directory
error Command failed with exit code 127.
原因:windows系统的换行回车是CRLF,类unix系统下是LF
解决方案:
// 用vs code打开把行尾序列由CRLF改成LF就可以了
node_modules/ee-bin/index.js
node_modules/ee-core/bin/tools.js
# 20:encrypt 命令时报错
error Cannot find module 'node:assert/strict'
- xxx ....../electron-egg/node_modules/bytenode/lib/index.js
- xxx ....../electron-egg/node_modules/ee-bin/tools/encrytp.js
原因:bytenode 模块的bug
解决方案:
// 安装一个指定版本 v1.3.6
npm uninstall bytenode
npm install bytenode@1.3.6
# 21:忽略ssl证书错误
ERROR:ssl_client_impl.cc(983) handshake failed; returned -1, SSL error code 1, net_error
原因:开发者可能加载了不安全的地址
解决方案:
// 生命周期文件 electron/index.js
const {app: electronApp} = require("electron");
async ready () {
electronApp.commandLine.appendSwitch('ignore-certificate-errors');
}
# 22:自动升级时,没有生成 latest.yml
解决方案:
在 ./config/builder.js
中,添加如下
"nsis": {
"oneClick": false,
......
......
},
// 添加这部分代码
"publish": [
{
"provider": "generic",
"url": ""
}
],
# 23:config 初始化未完成
内置模块调用报错,不要在顶部导入属性(或实例化模块对象),因为项目启动时,框架源码可能并没有加载完。
2023-05-11 18:31:01,546 ERROR 77836 [ee-core] [config] Frame initialization is not complete !
解决方案:
# 不要直接导出模块中某个对象,因为项目启动时,框架源码可能并没有加载完。
# 错误写法
const { logger } = require('ee-core/electron');
# 正确写法
const Log = require('ee-core/log');
# 24:api 404、跨域问题
原因:electron 为了安全,默认不允许跨域,即前端发送http请求访问其它服务的 api 时候,会报错。 或者,提示 api 404 错误。
解决方案:
// 使用了代理proxy,导致api找不到
解决方法:
1:把代理模式,换成 环境变量模式,如:在.env(开发环境、生产环境)文件里定义多个url变量并赋值,代码中的url地址
用环境变量代替。
2:设置config.default.json中的windowsOption.webPreferences.webSecurity=false
3:关闭同源策略
./electron/index.js
async ready () {
// const { app: electronApp } = require("electron");
electronApp.commandLine.appendSwitch("disable-web-security");
}
# 25:arm64打包报错
构建模块问题,请仔细阅读:issue#I8H21P (opens new window)