Electron + Vue 项目如何实现软件在线更新

本文主要介绍两种常见的更新思路

  1. 自动更新(autoUpdater / electron-updater 方式)
  2. 手动更新(自定义下载 + 安装包)

通过对比,你可以选择最适合自己项目的方案,也可以组合使用。


一、环境准备

  • Electron + Vue 项目结构(一般使用 electron-buildervue-cli-plugin-electron-builder 或类似脚手架)
  • npmElectronVueNode.js 基本知识有一定了解
  • 能够将 Electron 应用打包(生成 .exe / .dmg / .AppImage 等安装包)

如果你还没完成打包,请先确保“可以通过命令 electron-builder build”或相应脚本,成功得到可安装运行的产品包。


二、自动更新方式:使用 electron-updater

1. 原理概述

electron-builder 提供的 electron-updater 模块,会在应用启动时自动检查指定的更新服务器(如 GitHub Releases、S3、自定义服务等)。如果检测到新版本,Electron 会在后台下载增量或全量更新包,完成后提示用户“重启并更新”。整个流程对用户来说非常简便。

2. 配置打包(以 GitHub Releases 为例)

  1. package.jsonelectron-builder.yml 中指定发布信息

    {"name": "my-electron-app","version": "1.0.0","build": {"publish": [{"provider": "github","owner": "你的GitHub用户名","repo": "你的仓库名"}]}
    }
    
    • provider: "github":表示自动更新将从该 GitHub 项目 Releases 获取更新信息。
    • ownerrepo:对应你在 GitHub 上的用户名和仓库名称。
    • 若要使用 S3 或自定义服务器,可以将 "provider" 改成 "generic" / "s3" / "spaces" 等,并提供 url / bucket 等参数。
  2. 在 GitHub 仓库中发布新版本

    • 当你更新版本号并打包后,会生成如 v1.1.0.exelatest.yml 等文件;你需要将它们上传到 GitHub Releases 的新版本发布页。
    • electron-updater 会自动去获取最新的 Release 并对比版本号。

3. 代码实现:主进程中使用 autoUpdater

main.js(或 background.js)里引入并初始化:

const { app, BrowserWindow } = require('electron')
const { autoUpdater } = require('electron-updater')
const log = require('electron-log')function createWindow() {// 创建并加载你的 Vue 页面const mainWin = new BrowserWindow({ /* ... */ })// mainWin.loadURL('file://...') 或 http://localhost:8080
}function initAutoUpdater() {// 输出日志到文件,以便排查autoUpdater.logger = logautoUpdater.logger.transports.file.level = 'info'// 检查更新autoUpdater.checkForUpdatesAndNotify()// 监听事件:发现更新autoUpdater.on('update-available', (info) => {log.info('有新版本可用:', info.version)// 你也可以通过 IPC 通知渲染进程,弹出提示})// 监听事件:下载中autoUpdater.on('download-progress', (progress) => {log.info(`下载进度: ${progress.percent}%`)})// 监听事件:更新已下载autoUpdater.on('update-downloaded', (info) => {log.info('更新下载完成,将在重启后应用')// 你可以在这儿自动或让用户选择后再执行:// autoUpdater.quitAndInstall()})autoUpdater.on('error', (err) => {log.error('自动更新出错:', err)})
}app.whenReady().then(() => {createWindow()initAutoUpdater()
})
  • 当应用检测到新版本,会在后台下载。下载完成后,默认会在下一次应用重启时安装,也可用 autoUpdater.quitAndInstall() 立即重启并安装。
  • 生产环境下(你安装了打包好的 .exe / .dmg),应用启动时才会真正进行自动更新检测。开发模式下通常不会执行这个流程,或者检测不到更新。

4. 在渲染进程(Vue)中显示更新状态

若你想让前端 Vue 界面中有个“检查更新”按钮或进度条,可以通过 IPC 让主进程把事件信息发送给渲染进程。例如:

// main.js 主进程
autoUpdater.on('update-available', (info) => {mainWindow.webContents.send('update-available', info)
})
// 在 Vue 里 (渲染进程)
import { ipcRenderer } from 'electron'ipcRenderer.on('update-available', (event, info) => {this.showUpdateModal = truethis.newVersionInfo = info
})

这样,你就能在页面里提示用户“检测到新版本 vX.X.X”。其他事件同理。


三、手动更新方式:自定义下载 + 安装(推荐,可控性更强)

有些项目或团队希望完全掌控更新过程,不依赖 electron-updater,或者只在内网环境下分发安装包。这时可以采用手动更新思路。

1. 思路概述

  • 你在服务器上维护一个简单的“版本信息”接口(或文件),例如 latest-version.json,内容包括:
    {"latestVersion": "1.2.0","downloadUrl": "https://yourserver.com/myApp-1.2.0.exe","releaseNotes": "1. 优化登录流程\n2. 修复了若干bug"
    }
    
  • Vue 前端启动后请求这个接口,对比当前应用版本,若发现有新版本就提示用户。
  • 如果用户选择更新,就下载新的安装包(.exe / .dmg / .zip 等)。下载成功后,提示用户手动安装或由 Electron 打开安装包进行覆盖安装。

2. 详细步骤

第一步:提供最新版本信息

在任意服务器(或网盘)上放置一个 latest-version.json 文件,也可以是后端 API 返回类似结构。你只需确保应用能够访问到它。

示例:

{"latestVersion": "1.2.0","downloadUrl": "https://yourserver.com/downloads/myApp-1.2.0.exe","releaseNotes": "1. 优化了登录流程\n2. 修复了若干bug"
}
第二步:Vue 前端检查更新

在渲染进程中写一个方法 checkUpdate()

// 假设这是 Vue 组件里:
methods: {async checkUpdate() {const res = await axios.get('https://yourserver.com/latest-version.json')const remoteVersion = res.data.latestVersionconst downloadUrl = res.data.downloadUrlconst releaseNotes = res.data.releaseNotesconst localVersion = '1.0.0' // 可以从 package.json 或 app.getVersion() 获得if (this.compareVersion(remoteVersion, localVersion) > 0) {// 有新版本this.showUpdateModal = truethis.updateInfo = {remoteVersion,downloadUrl,releaseNotes}} else {alert('已是最新版本!')}},compareVersion(v1, v2) {// 简易的版本号比较函数const arr1 = v1.split('.').map(num => parseInt(num, 10))const arr2 = v2.split('.').map(num => parseInt(num, 10))for (let i = 0; i < Math.max(arr1.length, arr2.length); i++) {const a = arr1[i] || 0const b = arr2[i] || 0if (a > b) return 1if (a < b) return -1}return 0}
}
第三步:下载并安装
方式 1:让用户通过浏览器下载

最简单的做法:在弹窗里放一个下载链接 <a :href="downloadUrl">下载新版</a>,用户点击后浏览器会下载该安装包。下载完成后,用户手动双击即可安装覆盖。

方式 2:Electron内下载并执行

如果希望在 Electron 内部自动下载,再执行安装程序:

  1. 主进程或渲染进程 用 Node.js 模块下载文件。示例(渲染进程内可用 axios + fs,需在 Vue 项目里启用 Node 接口或在主进程中完成):这种方法太过于莽,存在安全风险,建议使用preload的方式安全使用node文件系统!
    const fs = require('fs')
    const path = require('path')
    const { shell } = require('electron') // 如果在渲染进程,要启用 nodeIntegrationasync function downloadAndInstall(url) {// 1. 下载const response = await axios.get(url, { responseType: 'arraybuffer' })const installerPath = path.join(require('os').tmpdir(), 'myApp-1.2.0.exe')fs.writeFileSync(installerPath, response.data)// 2. 打开安装包 (Windows上会执行 .exe 安装向导)shell.openPath(installerPath)// 这里也可以先弹窗告诉用户 "正在打开安装包,请在向导中确认完成更新"
    }
    
  2. 用户安装并重启
    • Windows 上执行 .exe.msi 安装向导后,会覆盖原安装目录或让用户选择新目录;
    • macOS 上执行 .dmg / .pkg,同理需要手动拖拽或安装;
    • 安装完成后,旧的进程要么自动退出,要么需要用户手动退出,然后重新打开新版本即可。

这样,你就实现了“自定义更新流程”:前端检测 -> 下载 -> 打开安装包 -> 覆盖安装 -> 用户重启。


四、两种方式的对比

方面自动更新(electron-updater)手动更新(自定义下载)
适用场景大多数常见的 Electron 桌面应用,需要自动检查/下载/无缝更新内网环境、对自动更新可控性要求高、或想保留更多用户操作自由
更新体验一键式后台下载 + 重启生效,几乎无额外操作用户手动下载并安装,或 Electron 打开安装包;操作步骤略多
实现难度配置 publish & 写几行 autoUpdater 代码即可需要自己管理版本接口、编写下载逻辑、处理安装后覆盖等
打包要求通常需要使用 nsis / dmg 并发布到 GitHub / S3 / 服务器无特殊限制,只要你能提供安装包下载地址即可
增量/全量更新electron-updater 可自动处理差分包(macOS delta, nsis diff)通常只能下载完整安装包,体积较大
可控性更新流程自动化较强,可定制的地方有限完全掌控逻辑,UI、下载行为、安装流程都可自行定义
团队协作对多数开发者更友好,官方支持、维护方便需自行编写/维护更新服务逻辑,适合对流程有特殊要求的团队

五、总结

  • 对于一般 Electron+Vue 桌面应用,优先推荐使用 electron-updater 自动更新,配置简单、用户体验好。你只要做好打包发布,即可让应用在后台检测并自动下载安装包。
  • 如果不方便使用 autoUpdater(如:内网环境,或需要自定义下载逻辑),你可以手动更新
    1. 前端拉取服务器的版本信息
    2. 检测到新版本后弹窗提示
    3. 让用户自行下载 .exe / .dmg / .zip
    4. 下载完成后引导安装或 Electron 内部直接执行安装包
    5. 安装完重启

两种方案都能达成“让用户轻松获取新版本”的目标,只是在自动化程度实现细节上不同。你可以根据项目需求、团队习惯、用户使用场景,选择或结合使用。


结尾

至此,我们介绍了 Electron + Vue 应用在线更新的两种思路:

  1. 自动更新 (autoUpdater + electron-builder):最常用、最省事、用户体验好。
  2. 手动更新(自定义下载 + 安装):逻辑自主可控,但需要用户多一步操作。

只要根据你的项目需求来选取合适方案,并按文中步骤配置或编写相应代码,就能让你的Electron桌面程序具备友好的在线升级能力。希望本文能帮到你,祝开发顺利!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/31844.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

docker 小记

一、卸载 查看当前版本 docker -v2. 如果有&#xff0c;先停止docker systemctl stop docker如果是yum安装&#xff0c;卸载方式为 #已防版本冲突&#xff0c;直接卸载 yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-lat…

XGBoost介绍

XGBoost&#xff1a;是eXtreme Gradient Boosting(极端梯度提升)的缩写&#xff0c;是一种强大的集成学习(ensemble learning)算法&#xff0c;旨在提高效率、速度和高性能。XGBoost是梯度提升(Gradient Boosting)的优化实现。集成学习将多个弱模型组合起来&#xff0c;形成一个…

Aliyun CTF 2025 web ezoj

文章目录 ezoj ezoj 进来一看是算法题&#xff0c;先做了试试看,gpt写了一个高效代码通过了 通过后没看见啥&#xff0c;根据页面底部提示去/source看到源代码&#xff0c;没啥思路&#xff0c;直接看wp吧&#xff0c;跟算法题没啥关系,关键是去看源码 def audit_checker(even…

大数据hadoop课程笔记

1.课程导入 柯洁 Alpha Go是人工智能领域的里程碑。 深度学习 大模型deepseek chatgpt 大模型 和 大数据 之间有着非常紧密的关系。可以说&#xff0c;大数据是大模型发展的基石&#xff0c;而大模型是大数据价值挖掘的重要工具。 https://youtu.be/nN-VacxHUH8?sifj7Ltk…

Pandas数据清洗实战之清洗猫眼电影

本次案例所需要用到的模块 pandas(文件读取保存 操作表格的模块) 将上次Scrapy爬取下来的文件 做个数据清洗 变成我们想要的数据 确定目的&#xff1a;将此文件中的duration字段中的分钟 和publisher_time上映去掉 只保留纯数值 数据清洗题目如下: 修复 publish_time列中的错…

UDP-网络编程/socket编程

一&#xff0c;socket相关接口 1&#xff0c;socket 我们来介绍socket编程的第一个接口&#xff1a;socket&#xff0c;它需要用到的头文件如图&#xff1a; 其中domain表示域或者协议家族&#xff1a; 本次我就用AF_INET&#xff08;ipv4&#xff09;来做演示 type参数表示…

《人月神话》:软件工程的成本寓言与生存法则

1975年&#xff0c;Fred Brooks在《人月神话》中写下那句振聋发聩的断言——“向进度落后的项目增加人力&#xff0c;只会让进度更加落后”——时&#xff0c;他或许未曾料到&#xff0c;这一观点会在半个世纪后的人工智能与云原生时代&#xff0c;依然如达摩克利斯之剑般悬在每…

ROS云课基础题库-01C++案例-甜甜圈

效率是核心&#xff0c;但效率高的教程会忽略掉非常多的细节。 解决问题的思路和细节对于一个问题的有效求解至关重要。 资料 云课五分钟-02第一个代码复现-终端甜甜圈C-CSDN博客 从云课五分钟到五秒钟焦虑的甜甜圈向前冲-CSDN博客 说明 复现重要性没有那么大&#xff0c;…

Oracle RHEL 5.8 安装 - 呆瓜式

前言 Red Hat Enterprise Linux Server release 5.8 为企业级 SO 镜像。绝大部分企业如果使用Oracle数据库均会使用其企业版 OS &#xff0c;能够很好的支持数据库的运行 文档目的 当前文档仅针对 VMware Workstation Pro 进行 OS 介质安装。 镜像下载地址 注意&#xff1…

【数据分析大屏】基于Django+Vue汽车销售数据分析可视化大屏(完整系统源码+数据库+开发笔记+详细部署教程+虚拟机分布式启动教程)✅

目录 一、项目背景 二、项目创新点 三、项目功能 四、开发技术介绍 五、项目功能展示 六、权威视频链接 一、项目背景 汽车行业数字化转型加速&#xff0c;销售数据多维分析需求激增。本项目针对传统报表系统交互性弱、实时性差等痛点&#xff0c;基于DjangoVue架构构建…

软件IIC和硬件IIC的主要区别,用标准库举例!

学习交流792125321&#xff0c;欢迎一起加入讨论&#xff01; 在学习iic的时候&#xff0c;我们经常会遇到软件 IC和硬件 IC,它两到底有什么区别呢&#xff1f; 软件 IC&#xff08;模拟 IC&#xff09;和硬件 IC&#xff08;外设 IC&#xff09;是两种实现 IC 总线通信的方式…

CSS-三大特性,盒子模型,圆角边框,盒子阴影,文字阴影

一、 CSS 的三大特性 CSS 有三个非常重要的三个特性:层叠性&#xff64;继承性&#xff64;优先级&#xff61; 1.层叠性 相同选择器给设置相同的样式,此时一个样式就会覆盖(层叠)另一个冲突的样式&#xff61;层叠性主要解决样式冲突 的问题 层叠性原则: 样式冲突,遵循的原…

基于 Qwen2.5-14B + Elasticsearch RAG 的大数据知识库智能问答系统

AI 时代&#xff0c;如何从海量私有文档&#xff08;非公开&#xff09;中快速提取精准信息成为了许多企业和个人的迫切需求。 本文介绍了一款基于 Qwen2.5-14B 大语言模型&#xff08;换成 DeepSeek 原理一致&#xff09;与 Elasticsearch 搜索引擎构建的大数据知识库智能问答…

算法手记1

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 目录 一.NC313 两个数组的交集 题目详情: 题目思路: 解题代码: 二.AB5 点击消除 题目详情: 题目思路: 解题代码: 结语 一.NC313 两个数组的交集 牛客网题目链接(点击即可跳转)…

JMeter使用BeanShell断言

BeanShell简介 BeanShell是使用Java语法的一套脚本语言&#xff0c;在JMeter的多种组件中都有BeanShell的身影&#xff0c;如&#xff1a; 定时器&#xff1a;BeanShell Timer前置处理器&#xff1a;BeanShell PreProcessor采样器&#xff1a;BeanShell Sampler后置处理器&am…

【技海登峰】Kafka漫谈系列(五)Java客户端之生产者Producer核心组件与实现原理剖析

【技海登峰】Kafka漫谈系列(五)Java客户端之生产者Producer核心组件与实现原理剖析 向Kafka Broker服务节点中发送主题消息数据的应用程序被称为生产者,生产者与消费者均属于Kafka客户端,几乎所有主流语言都支持调用客户端API。官方提供了基于Java实现的kafka-clients,用于…

【eNSP实战】配置交换机端口安全

拓扑图 目的&#xff1a;让交换机端口与主机mac绑定&#xff0c;防止私接主机。 主机PC配置不展示&#xff0c;按照图中配置即可。 开始配置之前&#xff0c;使用PC1 ping 一遍PC2、PC3、PC4、PC5&#xff0c;让交换机mac地址表刷新一下记录。 LSW1查看mac地址表 LSW1配置端…

AWS Bedrock 正式接入 DeepSeek-R1 模型:安全托管的生成式 AI 解决方案

亚马逊云科技&#xff08;AWS&#xff09;于 2024 年 1 月 30 日 宣布&#xff0c;DeepSeek-R1 模型 正式通过 Amazon Bedrock 平台提供服务&#xff0c;用户可通过 Bedrock Marketplace 或自定义模型导入功能使用该模型。 DeepSeek-R1&#xff0c;其安全防护机制与全面的 AI 部…

数据结构之线性表

目录 1 简介 2 线性表的基本概念 3 顺序存储的线性表 3.1 定义线性表结构 3.2 初始化线性表 3.3 插入元素 3.4 删除元素 3.5 查找元素 3.6 扩容操作 3.7 打印线性表 4 线性表的应用 5 总结 1 简介 线性表是数据结构中最基础且常用的一种结构&#xff0c;它是由一…

c#面试题12

1.ApplicationPool介绍一下 c#里没有 2.XML 可扩展标记语言&#xff0c;一般以.xml文件格式的形式存在。可用于存储结构化的数据 3.ASP.NET的用户控件 将原始的控件&#xff0c;用户根据需要进行整合成一个新的控件 4.介绍一下code-Behind 即代码后置技术&#xff0c;就是…