用户对桌面应用的耐心远比开发者预想的要少。一个安装包如果体积过大、安装步骤繁琐、更新弹窗频繁打断工作,很可能会导致卸载率的飙升。这一节讨论的是如何让安装和升级过程在用户侧几乎“不可见”,从而达到最高的留存率。
29.3.1 无感安装
“无感安装”并不是让用户不经过安装就直接运行(那是便携版),而是将安装流程精简到最少的交互步骤,甚至支持命令行静默安装,让企业 IT 管理场景也能轻松分发。
使用 electron-builder 生成的 Windows 安装包(NSIS)默认提供了一键安装的图形界面,用户只需要点击“安装”即可完成。但如果你希望做到真正的“无感”,可以在 NSIS 配置中加入静默安装开关:
// electron-builder 配置
"nsis": {
"oneClick": false,
"allowToChangeInstallationDirectory": true,
"include": "installer.nsh"
}
然后在 installer.nsh 中处理命令行参数 /S,实现静默安装逻辑。对于企业批量部署,这条路径是基本要求。
macOS 的 .dmg 镜像则天然接近无感 —— 用户只需要将 .app 拖入 Applications 文件夹即可,既不需要管理员权限,也没有注册表写入。如果通过 Homebrew Cask 分发,一条 brew install --cask your-app 就能完成全自动部署。
在真实项目中,如果你同时提供便携版(无需安装解压即用)和标准安装版,建议在下载页面给出清晰的选择理由:例如“便携版不会自动添加到开始菜单,也不支持自动更新”,让用户根据自己的需求决定。
29.3.2 静默更新
自动更新是现代桌面应用的标配,但“自动”不等于“打断”。Electron 生态中最成熟的方案是 electron-updater,它可以配置为完全后台静默下载,等应用下次启动时自动安装新版本,整个过程不需要用户做任何操作。
基本配置流程:
- 安装依赖
npm install electron-updater
- 主进程中初始化更新检查
const { autoUpdater } = require('electron-updater');
autoUpdater.autoDownload = false; // 先手动控制下载时机
autoUpdater.autoInstallOnAppQuit = true; // 退出时安装
app.on('ready', () => {
autoUpdater.checkForUpdatesAndNotify();
});
autoUpdater.on('update-available', () => {
// 通知渲染进程有新版本,但可以不打断用户
mainWindow.webContents.send('update-available');
});
autoUpdater.on('download-progress', (progress) => {
mainWindow.webContents.send('download-progress', progress.percent);
});
autoUpdater.on('update-downloaded', () => {
// 此时新版本已下载完毕,等待用户重启
mainWindow.webContents.send('update-downloaded');
});
- 发布渠道配置
在 package.json 或独立的 electron-builder.yml 中指定发布源。常见的有 GitHub Releases、S3 或自建静态服务器:
"build": {
"publish": [{
"provider": "github",
"owner": "your-org",
"repo": "your-repo"
}]
}
静默策略的关键点在于 “下载时不打断用户,安装时只在应用退出时触发”。你可以提供一个“新版本已准备好,重启生效”的静态提示条,但不要弹出模态框强行要求用户立即重启。这种微小的设计差异,往往决定了用户是否会认为你的应用“烦人”。
注意事项:macOS 下要实现完全静默更新,必须对你的应用进行代码签名和公证(Notarization),否则系统会在安装时弹出安全警告,破坏静默体验。Windows 下则需要提权处理:如果应用安装在 Program Files,更新程序需要管理员权限;如果安装在用户目录,则可以无权限更新。建议默认安装路径为用户本地目录,以消除 UAC 弹窗。
29.3.3 增量升级
全量更新的痛点是每次下载一个 100MB 以上的完整安装包,对于网络较慢的用户而言体验极差。增量升级(Delta Update)通过对比新旧版本的二进制差异,只下载差异部分(通常只有几 MB 到十几 MB),能极大缩短更新时间和减少流量消耗。
electron-updater 原生支持 BSdiff 算法的增量更新,你只需要做两件事:
- 服务端生成增量文件
每次发布新版本时,在 CI/CD 流水线中运行 electron-builder 时加上 --publish always,并开启增量更新开关:
# electron-builder.yml
win:
target:
- nsis
nsis:
differentialPackage: true # 为每个新版本生成与旧版本的差异包
这样,在发布目录中除了 .exe 安装包,还会生成多个 -delta.exe 文件,分别对应不同的旧版本。
- 客户端自动检测
electron-updater 在检测到新版本时,会自动查找与当前安装版本匹配的增量包。如果存在且有效,就下载较小的增量包;如果不可用,则回退到全量下载。整个过程对开发者完全透明,无需额外代码。
真实效果:以一个 120MB 的 Electron 应用为例,一次仅修改了渲染进程代码的升级,增量包大小通常在 2–8MB 之间,下载和安装速度提升了一个数量级。用户可能只是在后台看到“已更新”三个字的提示,完全没有感知到流量和时间的消耗。
注意事项:增量更新对于安装包内的 app.asar 文件尤其有效,因为大部分代码逻辑都打包在这个归档里。如果应用中包含了大量本地二进制依赖(如 ffmpeg),这些依赖版本稳定时不会产生差异,补丁效果同样出色。但要注意,增量更新要求安装包格式必须是 NSIS(Windows)或 DMG(macOS),便携版(portable)无法使用此功能。
小结
无感安装、静默更新和增量升级这三项的组合,构成了 Electron 应用从下载到长期使用的最佳体验闭环。它们一起保证了用户不会因为更新被打断而烦躁,不会因为几百兆的下载而犹豫,也不会因为复杂的安装步骤而放弃使用。在用户体验即产品的今天,这一点投入带来的留存率提升,远比功能列表上多一个复杂特性更加实在。