Electron 自动更新完整实现(全量更新 vs 增量更新 )

Electron 自动更新完整实现(全量更新 vs 增量更新)

本篇文章基于 electron-vite-vue 脚手架,完整展示 Electron 自动更新的两种实现方案:

  • 方案一:全量更新(默认,适合首次发布或大版本)
  • 方案二:增量更新(基于 .blockmap,适合小版本快速发布)

每种方案将从构建配置、更新流程、代码实现三个维度细化讲解。


🧱 统一前置依赖安装

npm install electron-updater electron-log

📁 目录结构推荐

electron-vite-vue/
├── electron/
│   ├── main/
│   │   └── updater.ts
│   └── preload/
│       └── index.ts
├── src/
│   ├── App.vue
├── package.json

✅ 方案一:全量更新(默认)

📦 构建配置(package.json)

"build": {
  "appId": "com.example.myapp",
  "productName": "MyApp",
  "win": {
    "target": "nsis"
  },
  "publish": {
    "provider": "github",
    "owner": "your-github",
    "repo": "your-repo"
  }
}

🛠 发布文件(上传到 GitHub Releases)

  • MyApp Setup 1.0.0.exe
  • latest.yml

🔧 主进程更新逻辑(updater.ts)

import { autoUpdater } from 'electron-updater'
import { BrowserWindow, ipcMain } from 'electron'
import log from 'electron-log'

export function setupAutoUpdater(win: BrowserWindow) {
  autoUpdater.logger = log
  log.transports.file.level = 'info'

  autoUpdater.autoDownload = false

  autoUpdater.on('update-available', () => {
    win.webContents.send('update-available')
  })

  autoUpdater.on('update-downloaded', () => {
    win.webContents.send('update-downloaded')
  })

  ipcMain.on('check-for-updates', () => {
    autoUpdater.checkForUpdates()
  })

  ipcMain.on('download-update', () => {
    autoUpdater.downloadUpdate()
  })

  ipcMain.on('install-update', () => {
    autoUpdater.quitAndInstall()
  })
}

⚡ 方案二:增量更新(使用 .blockmap)

📦 构建配置(package.json)

"build": {
  "appId": "com.example.myapp",
  "productName": "MyApp",
  "win": {
    "target": "nsis"
  },
  "nsis": {
    "differentialPackage": true
  },
  "publish": {
    "provider": "github",
    "owner": "your-github",
    "repo": "your-repo"
  }
}

🛠 发布文件(上传到 GitHub Releases)

  • MyApp Setup 1.0.1.exe
  • MyApp Setup 1.0.1.exe.blockmap
  • latest.yml

✅ 必须上传 .blockmap 才能启用增量下载。

📌 自动启用增量的前提:

  1. 上个版本的 .exe 文件完整可读取
  2. blockmap 文件无误
  3. 下载流程未被中断

🖥️ 通用渲染进程代码(App.vue)

<template>
  <div>
    <button @click="check">检查更新</button>
    <button v-if="canDownload" @click="download">下载更新</button>
    <button v-if="canInstall" @click="install">立即安装并重启</button>
  </div>
</template>

<script setup>
import { ref, onMounted } from 'vue'
const canDownload = ref(false)
const canInstall = ref(false)

function check() {
  window.electronAPI.checkForUpdates()
}
function download() {
  window.electronAPI.downloadUpdate()
}
function install() {
  window.electronAPI.installUpdate()
}

onMounted(() => {
  window.electronAPI.onUpdateAvailable(() => (canDownload.value = true))
  window.electronAPI.onUpdateDownloaded(() => (canInstall.value = true))
})
</script>

🛡️ 通用 Preload 脚本(preload/index.ts)

import { contextBridge, ipcRenderer } from 'electron'

contextBridge.exposeInMainWorld('electronAPI', {
  checkForUpdates: () => ipcRenderer.send('check-for-updates'),
  downloadUpdate: () => ipcRenderer.send('download-update'),
  installUpdate: () => ipcRenderer.send('install-update'),
  onUpdateAvailable: (cb: () => void) => ipcRenderer.on('update-available', cb),
  onUpdateDownloaded: (cb: () => void) => ipcRenderer.on('update-downloaded', cb)
})

📊 方案比较总结

对比维度全量更新增量更新(blockmap)
下载内容整包 .exe差异块(基于 blockmap)
更新包大小大(几十~百 MB)小(几 MB)
下载速度较慢更快
网络负载
容错性中等(依赖历史版本)
发布要求.exe + .yml.exe + .blockmap + .yml
适用场景初次发布、大改动小版本热更、频繁更新

✅ 推荐使用建议

使用场景推荐方案
第一次发布✅ 全量
结构或模块变动大✅ 全量
频繁发布小优化✅ 增量
低带宽用户环境✅ 增量
无法保证用户版本稳定✅ 全量

📚 延伸阅读

<think>好的,用户让我介绍Electron和Vue结合使用时的全量更新增量更新。我需要先理清楚这两个概念在Electron应用中的具体应用方式。 首先,Electron应用的结构是分为主进程和渲染进程的。主进程通常用Node.js编写,负责管理窗口和原生操作,而渲染进程则用Vue这样的前端框架构建用户界面。更新机制主要涉及主进程和如何下载、替换应用文件。 全量更新,应该是指每次更新都下载完整的安装包或应用文件,替换旧版本。这种方法简单可靠,但缺点是下载量大,尤其是应用体积大时,用户等待时间较长。需要确保下载的完整性,比如通过哈希校验。 增量更新则是只下载变化的部分,比如差异文件或补丁,然后在客户端合并。这种方法节省带宽,速度快,但实现复杂,需要处理合并的可靠性,特别是跨平台时的兼容性问题。另外,版本管理也是个挑战,必须确保用户当前的版本能够正确应用差异包。 接下来要考虑的是如何实现这两种更新Electron常用的更新方案有electron-updater,它支持全量更新。开发者需要配置自动更新服务器,比如使用Nuts或自己搭建的HTTPS服务器。对于增量更新,可能需要结合bsdiff或hdiff等工具生成差异包,然后客户端下载后合并。不过Electron本身没有内置支持,需要自己实现或使用第三方库。 用户可能的需求场景:如果他们希望快速部署且应用体积不大,全量更新可能更合适,维护简单。如果应用较大或用户网络条件差,增量更新能提升体验。但要注意增量更新的维护成本,比如生成和测试补丁的工作量。 可能用户没有说出来的深层需求是希望平衡更新效率和实现的复杂性。需要根据项目具体情况选择方案。另外,安全性和回滚机制也是需要考虑的因素,特别是增量更新出错时如何处理。 总结回答结构:先分别介绍全量增量更新的定义、优缺点,再讲实现方式,最后比较和选择建议。确保用户能理解两者的区别和适用场景,帮助他们做出决策。</think>在 **Electron + Vue** 应用中,全量更新增量更新是两种常见的应用升级策略,用于确保用户使用的客户端始终是最新版本。以下是两者的详细介绍和实现思路: --- ### **1. 全量更新** #### **定义** 全量更新是指每次更新时,客户端从服务器下载完整的应用程序安装包(如 `.exe`、`.dmg`、`.deb` 等),替换本地旧版本文件,实现版本升级。 #### **实现方式** 1. **Electron 内置方案** 使用 Electron 的 [electron-updater](https://www.electron.build/auto-update) 模块(集成于 `electron-builder`),配置自动更新服务: ```javascript const { autoUpdater } = require('electron-updater'); autoUpdater.checkForUpdatesAndNotify(); ``` - 需要将安装包托管在静态服务器(如 Amazon S3、GitHub Releases 或私有服务器)。 - 通过 `latest.yml`(或 `latest-mac.yml` 等)文件描述版本信息。 2. **自定义方案** - 通过接口获取最新版本号,比对本地版本。 - 若需要更新,下载完整安装包并触发静默安装(需调用系统命令)。 #### **优点** - 实现简单,可靠性高。 - 适合小型应用或更新频率低的场景。 #### **缺点** - 下载体积大,用户等待时间长。 - 流量消耗较高(尤其是大版本迭代)。 --- ### **2. 增量更新** #### **定义** 增量更新仅下载新旧版本之间的差异文件(如二进制差异补丁),在客户端本地合并差异,减少下载体积。 #### **实现方式** 1. **生成差异文件** - 使用工具(如 `bsdiff`、`hdiff` 或 `Courgette`)对比新旧版本,生成差异包(`.patch` 文件)。 - 示例命令: ```bash bsdiff old.exe new.exe patch.patch ``` 2. **客户端合并** - 客户端下载差异包后,使用对应工具合并旧版本文件,生成新版本。 - 需确保合并逻辑跨平台兼容(Windows/macOS/Linux)。 3. **版本管理** - 服务器需维护不同版本间的差异包映射关系(如 `v1.0.0 -> v1.0.1` 的补丁)。 #### **优点** - 下载体积小,速度快,节省流量。 - 用户体验更友好(尤其对大应用)。 #### **缺点** - 实现复杂,需处理合并失败、版本回退等异常。 - 维护成本高(需为每个旧版本生成补丁)。 --- ### **3. 对比与选型建议** | **场景** | **推荐策略** | |------------------------|-------------------| | 应用体积小,更新频率低 | 全量更新 | | 应用体积大,需频繁更新 | 增量更新 | | 跨平台兼容性要求高 | 全量更新(更稳定) | | 服务器资源有限 | 增量更新 | --- ### **4. 结合 Vue 的注意事项** 1. **渲染进程更新** - Vue 作为前端页面,可通过重新加载页面或替换静态资源(如 HTML/JS/CSS)实现更新,但需与 Electron 主进程版本管理分离。 2. **代码分离** - 将主进程代码(Electron)和渲染进程代码(Vue)分开打包,可独立更新渲染层(如通过 CDN 加载最新前端资源)。 --- ### **5. 安全与回滚** - **校验文件完整性**:使用哈希(如 SHA256)验证下载包。 - **回滚机制**:保留旧版本安装包,更新失败时自动回退。 --- 通过合理选择全量增量更新策略,可以显著提升 Electron + Vue 应用的更新效率和用户体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值