Electron 怎么实现自动更新?electron-updater 配置和完整流程
Electron 应用的自动更新用 electron-updater 实现,配合 electron-builder 打包。原理很简单:应用启动时检查远程服务器有没有新版本,有就下载并替换,下次启动生效。
最简配置
json// package.json { "build": { "publish": { "provider": "github", "owner": "your-username", "repo": "your-repo" } } }
typescript// main.ts import { autoUpdater } from 'electron-updater'; autoUpdater.autoDownload = false; autoUpdater.checkForUpdates(); autoUpdater.on('update-available', () => { // 通知用户有新版本 autoUpdater.downloadUpdate(); }); autoUpdater.on('update-downloaded', () => { // 下载完成,提示重启 autoUpdater.quitAndInstall(); });
三步:检查更新 → 下载 → 安装。autoDownload: false 让你控制何时下载(可以选择在用户确认后再下载,避免浪费流量)。
发布更新到 GitHub
每次发布新版本:
bash# 1. 改 package.json 版本号 npm version patch # 或 minor / major # 2. 打包并发布到 GitHub Releases electron-builder --publish always
--publish always 会自动把安装包上传到 GitHub Releases,并生成 latest.yml(Windows)/ latest-mac.yml(macOS)文件,electron-updater 靠这个文件判断是否有新版本。
不想自动发布,用 --publish never,手动上传到 GitHub Releases。
自建更新服务器
不想用 GitHub?任何静态文件服务器都行。electron-updater 只需要访问两个文件:
- 安装包(.exe / .dmg / .AppImage)
- 版本描述文件(latest.yml / latest-mac.yml)
json// package.json { "build": { "publish": { "provider": "generic", "url": "https://your-server.com/updates/" } } }
服务器目录结构:
shell/updates/ ├── latest.yml ├── myapp-1.2.0.exe ├── latest-mac.yml └── myapp-1.2.0.dmg
每次发版把安装包和 yml 文件放上去就行。
增量更新(Windows)
全量更新每次下载完整安装包(几十到上百 MB),对大应用不友好。Windows 支持增量更新(blockmap):只下载变化的部分,减少 80-90% 下载量。
electron-builder 打包时默认生成 .blockmap 文件,electron-updater 自动使用增量更新,不需要额外配置。macOS 和 Linux 不支持 blockmap 增量更新。
更新进度通知
下载大文件时应该显示进度:
typescriptautoUpdater.on('download-progress', (progress) => { const percent = progress.percent.toFixed(1); const speed = (progress.bytesPerSecond / 1024 / 1024).toFixed(1); // 发送到渲染进程显示 mainWindow.webContents.send('update-progress', { percent, speed: `${speed} MB/s` }); });
更新签名
macOS 必须签名才能自动更新,否则系统会拦截。Windows 建议签名,否则 SmartScreen 会弹警告。
macOS 签名配置:
json{ "build": { "mac": { "identity": "Developer ID Application: Your Name (TEAMID)", "hardenedRuntime": true, "entitlements": "build/entitlements.mac.plist" } } }
常见问题
更新检查不触发:开发模式(electron .)下 autoUpdater 不工作,必须打包成安装版才能测试更新流程。可以用 electron-builder build --dir 生成未安装的包本地测试。
macOS 更新后打不开:通常是签名或公证(notarization)问题。macOS 10.15+ 要求应用必须经过 Apple 公证,否则用户需要手动允许。在 electron-builder 里配 "afterSign": "electron-builder-notarize"。
版本号没变但提示更新:确保每次发布都改了 package.json 的 version。electron-updater 通过比较版本号判断是否需要更新。