升级
在我们开发应用完成后,一般需要做版本管理与升级。流程如下:
- 构建应用。
- 上传构建产物与版本文件(如:云存储)。
- 检查更新。
- 下载与更新。
补充信息
在我们检查更新的环节,还可以新增一个步骤叫作:升级策略检测。比如:
- 灰度升级、小流量升级。
- 启用和禁用版本。
- 存在发布升级相关版本信息。
- ...
因此,我们可以建立一个版本策略管理平台,在原有的升级流程前提供一个版本检测接口。
升级流程
补充信息
下述示例以【窗口中关闭 Node】的开发方式来演示。
我们在分别在主进程和渲染进程里提供了升级服务:updateService
。
主进程中定义检查更新
我们在主进程 electron/services/index.ts(主进程)
中定义一个检测升级的函数。
electron/services/index.ts(主进程)
export const startToUpdate = (url: string) => {
return updateService.checkForUpdates({
url,
receiver: 'main'
})
}
url
为检测升级的版本文件所在文件夹。- 比如升级版本文件 latest.yml 所在地址为:
https://xxx/xxx/latest.yml
,则检测升级的 url 为:https://xxx/xxx
- 比如升级版本文件 latest.yml 所在地址为:
receiver
为接收升级消息的窗口名。
补充信息
- 我们本质上使用的是 electron-updater 进行升级,因此,升级流程主要在主进程中,渲染进程负责升级交互即可。
- 我们检测升级也是在主进程里实现,渲染进程里触发。因此,我们定义检测升级函数在主进程中。
预加载脚本中提供检测升级函数
electron/preload/browserWindow/index.ts
export const apis = {
...
startToUpdate: (url: string) => {
return callMain('startToUpdate', url)
},
}
页面中升级交互
- 点击按钮,检测升级。
// 渲染进程中(比如: App.tsx)
import bridge from '@modern-js/runtime/electron-bridge';
<button
type="button"
onClick={() => {
bridge.startToUpdate('https://xx/xx')
}}>
检测更新
</button>
- 注册升级流程回调。
// 渲染进程中(比如: App.tsx)
import bridge, { IUpdateProgressInfo } from '@modern-js/runtime/electron-bridge';
useEffect(() => {
const idleListener = bridge.updateService.onUpdateIdle(() => {
console.log('暂无可用更新版本');
});
const updateProgressListener = bridge.updateService.onUpdateProgress((progress: IUpdateProgressInfo) => {
console.log('升级进度信息:', progress);
});
const updateErrorListener = bridge.updateService.onUpdateError((err: any) => {
console.error('升级失败:', err);
});
const updateDoneListener = bridge.updateService.onUpdateDone(() => {
console.error('升级完成, 重启');
bridge.updateService.restartAndInstall();
});
return () => {
// 解除监听
idleListener.dispose();
updateProgressListener.dispose();
updateErrorListener.dispose();
updateDoneListener.dispose();
}
}, [])
警告
上述检测升级,electron-builder 默认逻辑如下:
- 如果检测到版本比当前版本更大,则直接下载,否则不下载。