electron-egg + vue3 + vite 实现桌面应用
Electron-egg
Electron-egg是对electron的二次包装,
其中使用到的大部分API都和electron非常类似,
使用起来最大的亮点就是 跨平台性好
因为我也没用electron打过包就不过多胡诌了
实现过程
按照官网的介绍,拉取electron-egg框架:
1 | git clone https://github.com/dromara/electron-egg.git |
这里只介绍我本次项目用到的文件:
- build 打包用到的资源和脚本
- icons 后面打包成应用程序会用的图标
- data 内置数据库文件(没用到)
- electron 主进程服务
- addon 插件目录
- config 配置文件
- bin.js 开发环境配置
- config.default.js 默认配置
- config.local.js dev环境加载
- config.prod.js 生产环境加载
- encrypt.js 加密配置文件
- builder.json 打包配置
- controller 控制器
- service 业务层
- preload 预加载
- jobs 任务
- index.js 主进程生命周期
- frontend 前端目录
- logs 日志
- out 打包可执行文件目录
- public 资源目录
- dist 前端打包放在这
- html 模版
- electron js加密文件
- images 一些图片
- main.js 入口文件
使用electron-egg框架,
前端开发实际的文件都是放在frontend目录下的,
因此除了一些不必要的文件,我就直接把原先的vue+vite目录下的文件挪到frontend下了,
转到根目录下,安装electron-egg框架依赖包:
1 | npm run install |
转到frontend目录下,安装前端项目使用到的依赖包:
1 | cd frontend |
运行前端页面:
1 | npm run dev-frontend |
运行应用程序:
1 | npm run dev |
打包前端程序:
1 | npm run dev-frontend |
打包成可执行程序之前,
需要先把打包好的前端程序移动到根目录下/public文件夹中,
用打包的/dist替换原本的public/dist。
这里框架也提供了命令:
1 | npm run rd |
打包成可执行文件exe:
1 | npm run build-w-64 |
踩坑记录
运行白屏
用npm run dev启动项目,
electron弹出,一直停在loading的界面。
官方整理的问题中也提到了这个问题,
页面一直loading或白屏,就说明没有请求到对应的前端资源,
官方提到可能是前端路由模式错误,不能是history,必须改成hash
hash和history的区别
解决方法1:检查端口号配置
确保下面两个端口位置一致:
- vite.config.js server.port
1 | server:{ |
- electron/config/bin.js dev.frontend.port
1 | dev: { |
并且确保此端口没有被其它服务占用
解决方法2:检查vite.config.js中的base路由设置
vite.config.js中,base基础路由必须是’./‘
1 | base:'./' |
图标无法更换
electron/config/builder.json中能够配置exe打包图标的样式,
build/icons中存放着图标资源,
但是更换图标后依旧无效
因为windows缓存应用图标,
清理图标缓存的方法
cmd控制台输入:
1 | taskkill /im explorer.exe /f |
图标缓存的位置在:C:\Users\Administrator\AppData\Local\Microsoft\Windows\Explorer
explorer.exe: 资源管理器
iconcache.db 图标缓存文件
打包用到的icon生成
因为上面提到的windows图标缓存的原因,
改了很多次icon都没用,
以为是icon的问题,于是试了很多生成icon的方法,
都很艰难
窗口zoom不生效
一个蠢问题导致了另一个蠢问题……
用户屏幕分辨率是3840x2160的,开发用屏幕是1920x1080的,
因为正好是我的两倍,所以我就把浏览器的放大倍数缩小到50%,
然后把图切完了…… 这就等于没做屏幕适配,
在浏览器可以通过ctrl+滚轮放大缩小倍数,
但是桌面应用不行,但是在windowsOption中有个zoomFactor配置,
可以配置放大倍数,
我想让这个zoomFactor能够根据用户的屏幕进行适配,
但别说适配了,这个值生效都难,
就第一次配置生效了,之后接连修改好几次都没反应。
气麻了。
缓存,缓存,是因为有缓存!(麻了)
Previous zoomFactor is getting cached, unless you manually reset browserWindow’s zoom
缓存地址:C:\Users\Administrator\AppData\Roaming
删掉就行了。
至于根据屏幕分辨率设置zoomFactor这事,
我一手准备好electron提供的screen.getPrimaryDisplay().size,
获取主屏幕尺寸,
一手准备好win.setZoomFactor设置缩放率。
组合在一起,无事发生。
至于为什么没有实现我想要的效果,到现在我都没弄明白。
所以最后我还是乖乖的把px全都转换成了rem做页面适配……
electron安装失败
1 | npm install electron -g |
报错:
1 | RequestError: unable to verify the first certificate |
windows打包卡顿
electron和chrome版本对应
打开electron项目,发现像background-clip、text-wrap等css样式失效,
大概和electron对应的chrome版本较低有关。
根绝electorn-egg提供的这份版本对应表进行更新:
ssl证书错误
electron应用无法访问不安全地址
在index.js中的ready回调函数中忽略证书验证:
1 | async ready () { |
打包成exe后网络请求错误
打开election打包成的exe程序,
发现网络请求路径全都变成了file://开头的请求
- 1、将axios发送请求时替换成全路径
- 打包后算桌面程序,没有http服务器支持,加载的是静态页面
- 2、 electron开启允许跨域模式 webSecurity:false
- 全路径请求会出现跨域问题,因此要设置忽略安全策略
1 | const getData = params => axios({ |
1 | webPreferences: { |
electron打包后应用文件体积大
暂且还不知道这个如何解决,
但包壳前比包壳后多了250MB左右,
其中还包含Chromium内核。