增量升级
一般情况下会使用 asar 文件存储应用的业务逻辑代码,所以增量升级只要考虑更新这个文件即可。
Electron 应用启动时,会首先加载主进程的入口文件,这个文件是在打包 Electron 应用时指定的。
如下代码所示:
src/plugins/buildPlugin.ts
localPkgJson.main = "mainEntry.js";
假设这个文件(mainEntry.js)没有具体的业务功能逻辑,而是只完成这样的逻辑:判断一下当前用户环境中是否存在一个新版本的 asar 文件,如果有,就直接加载新版本 asar 文件中的业务代码(假设叫 mainLogic.js);如果没有,就加载当前 asar 文件中的业务代码 mainLogic.js。注意:mainEntry.js 和 mainLogic.js 都存在于 asar 文件中。
你可能会担心一个 asar 文件中的 js 代码是不是可以调用另一个 asar 中的 js 代码,这是没问题的。
如下代码可以正常执行,只要把 asar 当作一个目录即可,Electron 会完成具体的加载工作。
let mainLogicPath = path.join(`c://yourNewVersion.asar`, "mainLogic.js");
let mainLogic = require(this.mainPath);
mainLogic.start();
按照这个逻辑,就可以每次升级只升级 asar 文件,而不必升级整个应用了。
红色模块的逻辑是用户完成的,蓝色模块的逻辑都是在 mainEntry.js 中实现的,绿色模块的逻辑是在 mainLogic.js 文件中实现的。
mainLogic.js 不单单有绿色模块描述的业务逻辑,还包括整个应用的其他主进程业务逻辑。
在安装目录下的 asar 文件是一个完整应用的 asar 文件,它包括 mainEntry.js、mainLogic.js 和渲染进程的所有代码文件。
升级目录下的 asar 文件也是一个完整应用的 asar 文件,它也包括 mainEntry.js、mainLogic.js 和渲染进程的所有代码文件,只不过 mainEntry.js 文件对于它来说是可有可无的。
升级目录可以由开发者自己指定,推荐把这个目录指定为用户的 appData 目录下的一个子目录。
下载保存时,要注意 asar 文件的命名规则。比如:main.2.3.6.18.asar,其中 2.3.6 是产品的版本号,把这个版本号叫作大版本号;18 是 asar 文件的版本号,把这个版本号叫小版本号。
这样做有以下两个目的:
- 当用户多次增量升级应用程序后,升级目录下就会有多个 asar 文件,以这种规则命名 mainEntry.js 就可以方便地找到哪个文件是最新的。假设安装目录下的 asar 文件的版本号是 0,那么升级目录下的 asar 文件的版本号应该从版本号 1 开始。
- 应对用户自己重新安装了一个老旧的安装包的情况,当升级目录下有 main.2.3.7.1.asar 文件、也有 main.2.3.6.1.asar 文件时,但当前用户安装的产品的版本号是 2.3.6 时,不应该加载这个 main.2.3.7.1.asar,而应该加载 main.2.3.6.1.asar.
假设要考虑版本降级以应对版本发布后才发现了重大问题的场景,那么可以通过服务器给你的客户端发送一个指令,迫使你的客户端删除指定版本的 asar 文件,然后提示用户重启应用即可。
用户启动应用后,发现服务端有新的 asar 文件,下载成功后,马上又要求用户重启,如果你担心这会影响用户体验,那你可以把检查并下载新版本 asar 的逻辑放在主窗口显示之前,只有在服务端没有新 asar 文件或服务端无法访问时才会显示主窗口。
这样重启应用的逻辑也不需要用户确认了,即使客户端在没有网络的环境中,也可以正常运行。
但这样做会增加应用首屏加载的时间,不过开发者还可以加一个 splash window 以提升用户体验。
asar 文件不会太大,也就几兆,带给用户的负担更小,用户体验更好。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论