因业务需要使用electron开发客户端程序,项目中实现整包升级和热更新两种方式,现简单记录下
一、打包方式
项目使用 electron-builder 打包,因安装卸载高度自定义,所以在打包之后又实用nsis 进行了自定义打包生成最终的exe程序
二、升级方式
electron生态中electron-updater已经完美的实现了安装包升级,我们只需要接入插件便可实现整包升级
1.整包升级
整包升级使用electron-updater插件实现,nsis 打包的时候集成了electron-builder升级的参数。 electron-updater 根据业务场景不同,安装时会传入 /s --force-run 等参数,nsis集成了这部分功能,使其能够与其结合实现整包升级
此升级方式每次都会下载完整的安装包进行安装,对于大部分场景并不需要整包安装,整包下载对资源来说也是一种浪费
2.热更新
electron 框架打包会打包Chromium,大概60多m,这部分除了框架升级之外不会变动,所以热更新的时候不需要处理,resource 文件夹下存储的是electron打包之后代码文件。热更新只要更新这部分文件即可。这样既可以增加更新的效率,也可以减少更新包的体积,从整包的100m 减少到10m 一下
基于此思路,有这样几个问题:
- 升级包如何制作
- 如何判断升级及下载
- 如何进行升级
问题1: 升级包如何制作?
第一步:我们需要先打包升级包,上面说到会升级整个resource ,所以我们需要使用node 脚本将electron-builder 打包出来的win-unpacked/resources 文件夹整体打包成zip 文件
第二步: 我们需要给升级包编写说明文档,updater.json文件,其中包含文件名称,md5 以及版本号,用来后续升级判断时使用
问题2: 如何判断升级及下载
electron打包的resource 文件夹里存储的是打包之后的主进程和渲染进程代码,package.json 中我们可以存储当前程序的版本号,当接口查询到有升级包时,根据updater.json 文件信息和package.json 的版本号比对版本是否需要升级,判断需要升级时将resource.zip 文件下载到本地,然后升级updaer-info.json , 包含resource.zip的版本号以及md5、更新状态等信息,这里存储信息一方面是为了后续解压文件使用,一方面是为了下次下载的时候判断是否需要下载作为参照
问题3:如何进行升级
升级包下载完之后,此时会有 updaer-info.json 和resource.zip两个文件。但是electron 运行是asar被占用导致无法升级,此时需要我们借助三方程序来实现。比如go/c等等,具体思路如下:electron 下载完成之后调用三方程序,三方程序根据updaer-info.json的信息判断resource.zip是否正确,判断结束之后先解压zip ,解压成功之后删除resouce原文件夹,并将解压之后的文件名更换成resouce,更换完成之后修改updater-info.json 中的状态值。并唤起客户端。
至此热更新的逻辑描述结束,因特殊情况,暂时无法附上代码,有兴趣的可以自己实现下。