当前位置: 首页 > news >正文

详解 Electron 应用增量升级

Electron 应用的增量升级(又称“差量更新”)是指仅下载新旧版本之间差异的文件(而非完整安装包)来完成更新的方式,相比全量升级(下载完整新版本安装包),它能显著减少下载量、提升更新速度、节省用户流量,尤其适合频繁小版本迭代的场景。

一、增量升级的核心原理

增量升级的核心是差量包(Delta Package):通过算法(如 bsdiff)计算新旧版本文件的差异,生成仅包含变化内容的差量包;客户端下载差量包后,结合本地旧版本文件合并出完整的新版本文件,最终完成更新。

二、Electron 增量升级的实现工具

Electron 生态中,electron-updater(配合 electron-builder 打包工具)是实现增量升级的主流方案。electron-updater 从 v2.16.0 版本开始原生支持增量更新,无需额外集成第三方差量工具。

三、增量升级的完整实现步骤

1. 环境准备
  • 开发依赖:需安装 electronelectron-builder(打包工具)、electron-updater(更新逻辑)。
    npm install electron electron-updater --save
    npm install electron-builder --save-dev
    
  • 打包配置工具:通过 electron-builder 配置打包参数,生成差量包和版本信息文件。
  • 更新服务器:用于存放版本信息文件(如 latest.yml)、全量包、差量包(如 delta-v1.0.0-v1.1.0.zip),支持 HTTP/HTTPS 访问(如 Nginx、AWS S3 等)。
2. 差量包的生成(基于 electron-builder)

electron-builder 可自动生成差量包,需通过配置开启。

(1)配置 package.json

package.json 中通过 build 字段配置打包和更新参数,核心配置如下:

{"name": "my-electron-app","version": "1.1.0", // 当前版本"build": {"productName": "MyApp", // 应用名称"appId": "com.example.myapp", // 唯一标识(需符合平台规范)"publish": [{"provider": "generic", // 通用服务器(支持 HTTP/HTTPS)"url": "https://your-update-server.com/updates/" // 服务器存放更新文件的路径}],"deltaUpdate": true, // 开启差量包生成(关键配置)"win": {"target": ["nsis", "zip"] // Windows 目标格式(nsis 为安装包,zip 为绿色包)},"mac": {"target": ["dmg", "zip"] // macOS 目标格式}}
}
(2)生成差量包

执行打包命令时,electron-builder 会自动对比本地历史版本(需保留旧版本打包产物),生成差量包:

# 打包并生成差量包(以 Windows 为例)
electron-builder --win

打包完成后,输出目录(如 dist)会包含:

  • 全量包:如 MyApp Setup 1.1.0.exe(Windows)、MyApp-1.1.0.dmg(macOS);
  • 差量包:如 MyApp-1.0.0-1.1.0-delta.nupkg(Windows 差量包)、MyApp-1.0.0-1.1.0-delta.zip(macOS 差量包);
  • 版本信息文件:如 latest.yml(Windows)、latest-mac.yml(macOS),用于客户端检测更新。
3. 服务器配置

需将打包生成的全量包、差量包、版本信息文件上传到 package.json 中配置的服务器路径(如 https://your-update-server.com/updates/)。

版本信息文件(以 latest.yml 为例)的核心内容如下(自动生成,无需手动修改):

version: 1.1.0
files:- url: MyApp Setup 1.1.0.exesha512: [全量包的 SHA512 校验值]size: 10240000 # 全量包大小(字节)- url: MyApp-1.0.0-1.1.0-delta.nupkgsha512: [差量包的 SHA512 校验值]size: 102400 # 差量包大小(字节)deltaFrom: 1.0.0 # 差量包基于的旧版本
releaseDate: '2025-07-28T00:00:00.000Z'
4. 客户端更新逻辑(基于 electron-updater)

客户端需通过 electron-updaterAutoUpdater 模块实现更新检测、差量包下载、合并更新等逻辑。

(1)主进程配置更新逻辑

在 Electron 主进程(如 main.js)中添加以下代码:

const { app, autoUpdater } = require('electron');
const { join } = require('path');// 配置更新服务器地址(需与 package.json 中 publish.url 一致)
autoUpdater.setFeedURL({provider: 'generic',url: 'https://your-update-server.com/updates/'
});// 检测更新
function checkForUpdates() {autoUpdater.checkForUpdates();
}// 监听更新事件
autoUpdater.on('updateAvailable', (info) => {console.log('发现更新:', info.version);// 可提示用户“有新版本,是否开始更新?”
});// 监听下载进度
autoUpdater.on('downloadProgress', (progress) => {console.log(`下载进度:${Math.round(progress.percent)}%`);// 可在 UI 中显示进度条
});// 下载完成后提示安装
autoUpdater.on('updateDownloaded', (info) => {console.log('更新下载完成,准备安装');// 提示用户“更新已就绪,是否重启应用?”autoUpdater.quitAndInstall(); // 重启并安装更新
});// 监听更新错误(如差量包下载失败,自动 fallback 到全量包)
autoUpdater.on('error', (err) => {console.error('更新失败:', err.message);// 可提示用户“更新失败,尝试手动下载”
});// 应用启动后检测更新
app.whenReady().then(() => {checkForUpdates();
});
(2)渲染进程触发更新(可选)

如果需要在渲染进程(如前端页面)手动触发更新检测(如用户点击“检查更新”按钮),可通过 ipcMainipcRenderer 通信:

// 主进程(main.js)
const { ipcMain } = require('electron');
ipcMain.handle('check-updates', () => {checkForUpdates();
});// 渲染进程(renderer.js)
const { ipcRenderer } = require('electron');
document.getElementById('check-update-btn').addEventListener('click', () => {ipcRenderer.invoke('check-updates');
});

四、关键细节与注意事项

  1. 差量包的兼容性
    差量包仅适用于“指定旧版本→新版本”的更新(如 deltaFrom: 1.0.0 表示仅支持从 1.0.0 升级到 1.1.0)。如果用户跳过多个版本(如从 1.0.0 直接升级到 1.2.0),electron-updater 会自动判断是否支持多级差量更新(如 1.0.0→1.1.0→1.2.0),若不支持则 fallback 到全量包。

  2. 安全性校验
    electron-updater 会自动校验全量包/差量包的 SHA512 哈希值(与版本信息文件中的校验值比对),若不匹配则判定为文件损坏,自动重试或切换到全量包,防止恶意文件篡改。

  3. 平台差异处理

    • Windows:差量包基于 nsis 安装包生成,需确保旧版本安装路径与新版本一致;
    • macOS:差量包基于 zip 格式(绿色包)生成,需注意应用签名的兼容性;
    • Linux:通常使用 deb/rpm 包管理,差量更新支持较弱,建议优先使用全量包。
  4. 错误处理与回滚
    若差量包合并失败(如本地旧文件损坏),electron-updater 会自动删除临时文件并尝试下载全量包;若全量包也失败,需提示用户手动下载安装包。

  5. 差量包的适用场景
    差量包的优势在“小版本迭代”(如修复 bug、轻微功能调整)中明显(差量包大小可能仅为全量包的 10%-30%);若版本差异过大(如重构核心模块),差量包可能接近全量包大小,此时无需强制启用。

工具与参考资料

  • 核心工具electron-builder(打包+差量包生成)、electron-updater(客户端更新逻辑);
  • 差量算法:基于 bsdiff(生成差量)和 bspatch(合并差量);
  • 官方文档
    • electron-builder 差量更新配置
    • electron-updater 自动更新文档
http://www.dtcms.com/a/303572.html

相关文章:

  • 轻量级远程开发利器:Code Server与cpolar协同实现安全云端编码
  • 2. 编程语言-JAVA-Spring Security
  • 记录自己第n次面试(n>3)
  • JavaScript手录08-对象
  • 深入解析IPMI FRU规范:分区结构与字段标识详解
  • 10_opencv_分离颜色通道、多通道图像混合
  • Nuxt3 全栈作品【通用信息管理系统】修改密码
  • OpenLayers 综合案例-热力图
  • 在虚拟机ubuntu上修改framebuffer桌面不能显示图像
  • C++进阶—C++11
  • 5G 便携式多卡图传终端:移动作业的 “实时感知纽带”
  • 【unitrix】 6.19 Ord特质(ord.rs)
  • 【灰度实验】——图像预处理(OpenCV)
  • 2025年7月28日训练日志
  • 【三桥君】如何解决后端Agent和前端UI之间的交互问题?——解析AG-UI协议的神奇作用
  • 排水管网实时监测筑牢城市安全防线
  • 线程间-数据缓存机制(线程邮箱)
  • CDN架构全景图
  • STM32 usb HOST audio USB 音频设备 放音乐
  • springCloudAlibaba集成Dubbo
  • 【版本更新】火语言 0.9.94.0 更新
  • 虚拟面孔,真实革命
  • Product Hunt 每日热榜 | 2025-07-28
  • JAVA_EIGHTEEN_特殊文件
  • STM32——寄存器映射
  • LLaMA-Factory微调教程2:命令行sft微调
  • 【拓扑排序 缩点】P2272 [ZJOI2007] 最大半连通子图|省选-
  • 【跳跃游戏】
  • BUUCTF-MISC-[HBNIS2018]caesar1
  • Linux驱动22 --- RV1126 环境搭建设备树修改