详解 Electron 应用增量升级
Electron 应用的增量升级(又称“差量更新”)是指仅下载新旧版本之间差异的文件(而非完整安装包)来完成更新的方式,相比全量升级(下载完整新版本安装包),它能显著减少下载量、提升更新速度、节省用户流量,尤其适合频繁小版本迭代的场景。
一、增量升级的核心原理
增量升级的核心是差量包(Delta Package):通过算法(如 bsdiff
)计算新旧版本文件的差异,生成仅包含变化内容的差量包;客户端下载差量包后,结合本地旧版本文件合并出完整的新版本文件,最终完成更新。
二、Electron 增量升级的实现工具
Electron 生态中,electron-updater
(配合 electron-builder
打包工具)是实现增量升级的主流方案。electron-updater
从 v2.16.0 版本开始原生支持增量更新,无需额外集成第三方差量工具。
三、增量升级的完整实现步骤
1. 环境准备
- 开发依赖:需安装
electron
、electron-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-updater
的 AutoUpdater
模块实现更新检测、差量包下载、合并更新等逻辑。
(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)渲染进程触发更新(可选)
如果需要在渲染进程(如前端页面)手动触发更新检测(如用户点击“检查更新”按钮),可通过 ipcMain
和 ipcRenderer
通信:
// 主进程(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');
});
四、关键细节与注意事项
-
差量包的兼容性
差量包仅适用于“指定旧版本→新版本”的更新(如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 到全量包。 -
安全性校验
electron-updater
会自动校验全量包/差量包的 SHA512 哈希值(与版本信息文件中的校验值比对),若不匹配则判定为文件损坏,自动重试或切换到全量包,防止恶意文件篡改。 -
平台差异处理
- Windows:差量包基于
nsis
安装包生成,需确保旧版本安装路径与新版本一致; - macOS:差量包基于
zip
格式(绿色包)生成,需注意应用签名的兼容性; - Linux:通常使用
deb
/rpm
包管理,差量更新支持较弱,建议优先使用全量包。
- Windows:差量包基于
-
错误处理与回滚
若差量包合并失败(如本地旧文件损坏),electron-updater
会自动删除临时文件并尝试下载全量包;若全量包也失败,需提示用户手动下载安装包。 -
差量包的适用场景
差量包的优势在“小版本迭代”(如修复 bug、轻微功能调整)中明显(差量包大小可能仅为全量包的 10%-30%);若版本差异过大(如重构核心模块),差量包可能接近全量包大小,此时无需强制启用。
工具与参考资料
- 核心工具:
electron-builder
(打包+差量包生成)、electron-updater
(客户端更新逻辑); - 差量算法:基于
bsdiff
(生成差量)和bspatch
(合并差量); - 官方文档:
- electron-builder 差量更新配置
- electron-updater 自动更新文档