electron客户端实现增量更新方案

1,455 阅读3分钟

在 Electron 应用中实现增量更新客户端是一个常见的需求,尤其是当应用体积较大时,增量更新可以显著减少用户下载更新包的时间。以下是实现增量更新的常见方案和步骤:


1. 增量更新的基本原理

增量更新的核心思想是只下载和安装有变化的部分(如代码、资源文件等),而不是整个应用。通常包括以下步骤:

  • 检测新版本。
  • 下载差异文件(增量包)。
  • 应用更新并重启客户端。

2. 实现方案

以下是几种常见的实现方案:

方案 1:使用 electron-builder + electron-updater

electron-builder 是一个流行的 Electron 打包工具,内置了 electron-updater 模块,支持增量更新。

步骤:

  1. 安装依赖:

    npm install electron-builder electron-updater
    
  2. 配置 electron-builderpackage.json 中添加以下配置:

    "build": {
      "publish": [
        {
          "provider": "generic",
          "url": "https://your-update-server.com"
        }
      ],
      "win": {
        "target": "nsis"
      },
      "mac": {
        "target": "dmg"
      },
      "linux": {
        "target": "AppImage"
      }
    }
    
  3. 在主进程中启用自动更新:

    const { autoUpdater } = require('electron-updater');
    const log = require('electron-log');
    
    autoUpdater.logger = log;
    autoUpdater.logger.transports.file.level = 'info';
    
    autoUpdater.on('checking-for-update', () => {
      log.info('Checking for update...');
    });
    
    autoUpdater.on('update-available', (info) => {
      log.info('Update available:', info);
    });
    
    autoUpdater.on('update-not-available', (info) => {
      log.info('Update not available:', info);
    });
    
    autoUpdater.on('error', (err) => {
      log.error('Update error:', err);
    });
    
    autoUpdater.on('update-downloaded', (info) => {
      log.info('Update downloaded, restarting...');
      autoUpdater.quitAndInstall();
    });
    
    // 启动时检查更新
    app.on('ready', () => {
      autoUpdater.checkForUpdatesAndNotify();
    });
    
  4. 部署更新文件:

    • 打包应用时生成更新文件(如 .yml.zip)。
    • 将更新文件上传到服务器(如 https://your-update-server.com)。
  5. 增量更新支持:

    • electron-builder 默认支持增量更新,只需确保服务器提供正确的增量包即可。

方案 2:手动实现增量更新

如果需要更灵活的控制,可以手动实现增量更新逻辑。

步骤:

  1. 检测新版本:

    • 在客户端请求服务器接口,获取最新版本信息。
    • 对比本地版本和服务器版本,判断是否需要更新。
  2. 下载增量包:

    • 从服务器下载差异文件(如 .zip.patch 文件)。
    • 可以使用 axiosnode-fetch 下载文件。
  3. 应用更新:

    • 使用 fs 模块解压或替换文件。
    • 重启应用以应用更新。

示例代码:

const fs = require('fs');
const path = require('path');
const { app } = require('electron');
const axios = require('axios');
const extract = require('extract-zip');

async function checkForUpdates() {
  const localVersion = app.getVersion();
  const { data: remoteVersion } = await axios.get('https://your-server.com/version');

  if (remoteVersion > localVersion) {
    const updateUrl = 'https://your-server.com/update.zip';
    const updatePath = path.join(app.getPath('temp'), 'update.zip');
    const extractPath = app.getAppPath();

    // 下载更新包
    const response = await axios.get(updateUrl, { responseType: 'stream' });
    response.data.pipe(fs.createWriteStream(updatePath));

    response.data.on('end', async () => {
      // 解压更新包
      await extract(updatePath, { dir: extractPath });
      // 重启应用
      app.relaunch();
      app.quit();
    });
  }
}

app.on('ready', () => {
  checkForUpdates();
});

方案 3:使用第三方服务

可以使用一些第三方服务来简化增量更新的实现,例如:

  • Electron Forge:内置更新支持。
  • Squirrel.Windows:适用于 Windows 平台的增量更新框架。
  • Hazel:一个开源的更新服务器。

3. 增量更新的注意事项

  • 版本管理:确保版本号规范(如语义化版本 x.y.z),便于比较。
  • 安全性:对更新包进行签名和校验,防止篡改。
  • 回滚机制:如果更新失败,应支持回滚到旧版本。
  • 兼容性:确保增量包与客户端环境兼容。

4. 推荐工具

  • 打包工具electron-builderelectron-forge
  • 更新模块electron-updatersquirrel-updater
  • 压缩工具extract-zipadm-zip

通过以上方案,你可以轻松实现 Electron 客户端的增量更新功能。如果应用规模较大,建议优先使用 electron-builder + electron-updater,这是最成熟和高效的方案。