electron-updater实现electron全量版本更新

在 Electron 应用中使用 electron-updater 来实现自动更新功能时,通常你会在一个专门的模块或文件中管理更新逻辑。如果你想要使用 ES6 的 import 语法来引入 electron-updater,你需要确保你的项目已经配置好了支持 ES6 模块的构建工具(如 Webpack)或者使用 Babel 这样的转译器。

以下是一个基本的示例,展示了如何使用 import 语句来引入 electron-updater 并实现基本的更新逻辑。


安装 electron-updater:


bash
npm install electron-updater --save-dev

bash
yarn add electron-updater --dev

核心代码实现

/*
 * 升级版本
 * @Author: diygw
 */
import { ipcMain } from 'electron'
import { autoUpdater } from 'electron-updater'
let mainWindow: any = null
export function upgradeHandle(window: any, feedUrl: any) {
  const msg = {
    error: '检查更新出错 ...',
    checking: '正在检查更 ...',
    updateAva: '检测到新版本 ...',
    updateNotAva: '已经是最新版本 ...',
    downloadProgress: '正在下载新版本 ...',
    downloaded: '下载完成,开始更新 ...'
  }
  mainWindow = window
  autoUpdater.autoDownload = false //true 自动升级 false 手动升级
  //设置更新包的地址
  autoUpdater.setFeedURL(feedUrl)

  //监听升级失败事件
  autoUpdater.on('error', function (message: any) {
    sendUpdateMessage({
      cmd: 'error',
      title: msg.error,
      message: message
    })
  })
  //监听开始检测更新事件
  autoUpdater.on('checking-for-update', function () {
    sendUpdateMessage({
      cmd: 'checking-for-update',
      title: msg.checking,
      message: ''
    })
  })
  //监听发现可用更新事件
  autoUpdater.on('update-available', function (message: any) {
    sendUpdateMessage({
      cmd: 'update-available',
      title: msg.updateAva,
      message: message
    })
  })
  //监听没有可用更新事件
  autoUpdater.on('update-not-available', function (message: any) {
    sendUpdateMessage({
      cmd: 'update-not-available',
      title: msg.updateNotAva,
      message: message
    })
  })

  // 更新下载进度事件
  autoUpdater.on('download-progress', function (message: any) {
    sendUpdateMessage({
      cmd: 'download-progress',
      title: msg.downloadProgress,
      message: message
    })
  })
  //监听下载完成事件
  autoUpdater.on(
    'update-downloaded',
    function (event: any) {
      sendUpdateMessage({
        cmd: 'update-downloaded',
        title: msg.downloaded,
        message: '最新版本已下载完成, 退出程序进行安装'
      })
      //退出并安装更新包
      autoUpdater.quitAndInstall()
    }
  )

  //接收渲染进程消息,开始检查更新
  ipcMain.on('checkForUpdate', () => {
    //执行自动更新检查
    autoUpdater.checkForUpdatesAndNotify()
  })
  ipcMain.on('downloadUpdate', () => {
    // 下载
    autoUpdater.downloadUpdate()
  })
}
//给渲染进程发送消息
function sendUpdateMessage(text: any) {
  mainWindow.webContents.send('update-message', text) 
}

  主进程引用 


// 在你的主进程文件(如 main.js)中引入并使用  

import { upgradeHandle } from './upgrade'
upgradeHandle(mainWindow, "https://****")

结合页面调用

<script setup lang="ts">
    import { ElMessage } from 'element-plus';
    import { reactive, ref } from 'vue';
    const dialogVisible = ref(false);
    const percentage = ref(0);
    let ipcRenderer = window.electron?.ipcRenderer;
    let state = reactive({
        oldversion: undefined,
        version: undefined,
        isnew: false
    });

    function compareVersion(version1, version2) {
        const newVersion1 =
            `${version1}`.split('.').length < 3 ? `${version1}`.concat('.0') : `${version1}`;
        const newVersion2 =
            `${version2}`.split('.').length < 3 ? `${version2}`.concat('.0') : `${version2}`;
        //计算版本号大小,转化大小
        function toNum(a) {
            const c = a.toString().split('.');
            const num_place = ['', '0', '00', '000', '0000'],
                r = num_place.reverse();
            for (let i = 0; i < c.length; i++) {
                const len = c[i].length;
                c[i] = r[len] + c[i];
            }
            return c.join('');
        }

        //检测版本号是否需要更新
        function checkPlugin(a, b) {
            const numA = toNum(a);
            const numB = toNum(b);
            return numA > numB ? 1 : numA < numB ? -1 : 0;
        }
        return checkPlugin(newVersion1, newVersion2);
    }
    if (ipcRenderer) {
        window.electron.ipcRenderer.invoke('diygw-get-version').then(res => {
            let version = res.data || res;
            state.oldversion = version;
        });
        //接收主进程版本更新消息
        window.electron.ipcRenderer.on('update-message', (event, arg) => {
            console.log(arg);
            if ('update-available' == arg.cmd) {
                state.version = arg.message.version;
                if (compareVersion(state.version, state.oldversion) > 0) {
                    state.isnew = true;
                }
                // 假设我们有一个名为 'userProfile' 的路由
                //显示升级对话框
            } else if ('download-progress' == arg.cmd) {
                //更新升级进度
                console.log(arg.message.percent);
                dialogVisible.value = true;
                let percent = Math.round(parseFloat(arg.message.percent));
                percentage.value = percent;
            } else if ('error' == arg.cmd) {
                dialogVisible.value = false;
                ElMessage.error('更新失败');
            }
        });
        window.electron.ipcRenderer.send('checkForUpdate');
    } else {
        //用来测试显示
        // state.oldversion = 1;
        // state.version = 1;
        // state.isnew = true;
    }
    const download = () => {
        window.electron.ipcRenderer.send('downloadUpdate');
    };
    const openLink = url => {
        window.electron.ipcRenderer.invoke('diygw-down', {
            text: url
        });
    };
</script>

<template>
    <div class="flex container flex-direction-column">
        <div class="text-lg text-bold">关于</div>
        <div class="flex flex1">
            <div class="flex-direction-column align-center flex" style="padding: 10px 40px">
                <img src="../assets/logo.png" style="width: 100px" />
                <div class="text-bold">DIYGW可视化</div>
            </div>
            <div class="flex1 flex-direction-column flex" style="font-size: 14px">
                <div class="flex">
                    <div>
                        <el-text class="padding-right" v-if="state.oldversion">
                            当前版本:{{ state.oldversion }}
                        </el-text>
                        <el-text v-if="state.version && state.isnew">
                            最新版本:{{ state.version }}
                        </el-text>
                        <el-text
                            class="padding-right"
                            type="danger"
                            @click="download()"
                            v-if="state.version && state.isnew"
                        >
                            点击更新
                        </el-text>
                    </div>
                </div>
                <div class="margin-top" v-if="dialogVisible">
                    <el-progress
                        status="success"
                        :text-inside="true"
                        :stroke-width="20"
                        :percentage="percentage"
                        :show-text="true"
                    ></el-progress>
                </div>
                <div class="flex text-center margin-top">
                    <div
                        @click="openLink('https://www.diygw.com')"
                        class="text-bg-tip link margin-right flex-sub"
                    >
                        访问网站
                    </div>
                    <div
                        @click="openLink('https://www.diygw.com/69')"
                        class="text-bg-tip link flex-sub"
                    >
                        帮助文档
                    </div>
                </div>

                <div class="margin-top text-bg-tip">
                    <p>DIY官网可视化工具</p>
                    <p>可视化拖拽开发神器</p>
                    <p>无须编程 零代码基础 所见即所得设计工具</p>
                    <p>轻松制作UniApp、微信小程序、支付宝小程序、Vue3、H5、WebApp、单页动画</p>
                    <p>UniApp框架量身设计</p>
                    <p>涵盖uniapp各个方面,助力900万Uniapp+开发者。</p>
                    <p>一套代码编到十几个平台,这不是梦想。</p>
                    <p>高效可视化开发工具快速与HBuilder X开发联调。</p>
                    <p>强大的代码生成器,让您感受先进的生产力,让您的想法快速上线。</p>
                </div>
            </div>
        </div>
    </div>
</template>

请注意,electron-updater 的配置可能会根据你的 Electron 打包工具(如 electron-packager, electron-builder 等)和项目设置有所不同。例如,如果你使用的是 electron-builder,你需要在 package.json 中添加一些配置来确保 electron-updater 能正常工作。

此外,上述代码中的 autoUpdater.quitAndInstall(); 调用在 macOS 上可能不是必需的,因为 macOS 上的更新通常会自动处理。在 Windows 上,你可能需要显式调用此方法来重启应用并安装更新。

最后,请确保在 Electron 的主进程中调用更新逻辑,因为 electron-updater 需要访问文件系统和其他敏感资源。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Fastapi】参数获取,json和query

【Fastapi】参数获取&#xff0c;json和query 前言giteegithub query形式json传递同步方法使用json 前言 花了半个月的时间看了一本小说&#xff0c;懈怠了…今天更新下fastapi框架的参数获取 gitee https://gitee.com/zz1521145346/fastapi_frame.git github https://git…

828华为云征文|Flexus云服务器X实例实践:部署Alist文件列表程序

828华为云征文&#xff5c;Flexus云服务器X实例实践&#xff1a;部署Alist文件列表程序 引言一、Flexus云服务器X实例介绍1.1 Flexus云服务器X实例简介1.2 主要使用场景 二、购买Flexus云服务器X实例2.1 购买规格参考2.2 查看Flexus云服务器X实例状态 三、远程连接Flexus云服务…

python是什么语言写的

Python是一种计算机程序设计语言。是一种面向对象的动态类型语言。现今Python语言很火&#xff0c;可有人提问&#xff0c;这么火的语言它的底层又是什么语言编写的呢&#xff1f; python是C语言编写的&#xff0c;它有很多包也是用C语言写的。 所以说&#xff0c;C语言还是很…

二分查找算法(5) _山脉数组的峰顶索引

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 二分查找算法(5) _山脉数组的峰顶索引 收录于专栏【经典算法练习】 本专栏旨在分享学习算法的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c;…

二分算法——优选算法

个人主页&#xff1a;敲上瘾-CSDN博客 个人专栏&#xff1a;游戏、数据结构、c语言基础、c学习、算法 本章我们来学习的是二分查找算法&#xff0c;二分算法的应用非常广泛&#xff0c;不仅限于数组查找&#xff0c;还可以用于解决各种搜索问题、查找极值问题等。在数据结构和算…

海外仓商品退换货管理:选择系统为何至关重要?

随着跨境电商的蓬勃发展&#xff0c;退换货问题成为了卖家们不得不面对的挑战。退换货处理不仅繁琐&#xff0c;而且对效率和服务质量的要求极高。因此&#xff0c;许多卖家选择海外仓来简化退换货流程。然而&#xff0c;海外仓在处理退换货时同样面临诸多难题&#xff0c;涉及…

openeuler 22.03 lts sp4 使用 kubeadm 部署 k8s-v1.28.2 高可用集群

文章目录 [toc]废话篇这篇文章什么时候写的为什么是 openeuler为什么是 22.03 lts sp4高可用架构题外话 干活篇环境介绍系统初始化相关关闭防火墙关闭 selinux关闭 swap开启内核模块开启模块自动加载服务 sysctl 内核参数调整清空 iptables 规则安装各种依赖和工具修改 .bashrc…

【uni-app】小兔鲜项目-基础架构-请求和上传文件拦截器

注意事项 uni.request 请求封装 请求和上传文件拦截器 uniapp 拦截器&#xff1a; uni.addInterceptor 接口说明&#xff1a;接口文档 实现需求 拼接基础地址设置超时时间添加请求头标识添加 token 参考代码 // src/utils/http.ts// 请求基地址 const baseURL https://pca…

ArcGIS Desktop使用入门(三)图层右键工具——拓扑(下篇:地理数据库拓扑)

系列文章目录 ArcGIS Desktop使用入门&#xff08;一&#xff09;软件初认识 ArcGIS Desktop使用入门&#xff08;二&#xff09;常用工具条——标准工具 ArcGIS Desktop使用入门&#xff08;二&#xff09;常用工具条——编辑器 ArcGIS Desktop使用入门&#xff08;二&#x…

浅析OceanBase数据库的向量化执行引擎

本篇博客是偏数据库系统概念性的内容&#xff0c;不会深入到 OceanBase 中各个算子和表达式的在向量化中的详细设计和实现。 背景 为了提升OceanBase社区版用户解决问题的效率&#xff0c;OceanBase官方不久前推出了《OceanBase 从入门到实践》系列课程。在第七期直播课程后&a…

Llama 3.1 技术研究报告-2

3.3 基础设施、扩展性和效率 我们描述了⽀持Llama 3 405B⼤规模预训练的硬件和基础设施&#xff0c;并讨论了⼏项优化措施&#xff0c;这些措施提⾼了训练效率。 3.3.1 训练基础设施 Llama 1和2模型在Meta的AI研究超级集群&#xff08;Lee和Sengupta&#xff0c;2022&#x…

软件设计师:01计算机组成与结构

文章目录 一、校验码1.奇偶校验码2.海明码3.循环冗余检验码 二、原码反码补码移码三、浮点数表示法1.浮点数相加时 四、寻址方式五、CPU1.访问速度2.cpu的组成 六、RISC和CISC&#xff08;<font color red>只用记住不同就可以&#xff09;七、冗余技术1.结构冗余2.信息冗…

2018年国赛高教杯数学建模D题汽车总装线的配置问题解题全过程文档及程序

2018年国赛高教杯数学建模 D题 汽车总装线的配置问题 一&#xff0e;问题背景   某汽车公司生产多种型号的汽车&#xff0c;每种型号由品牌、配置、动力、驱动、颜色5种属性确定。品牌分为A1和A2两种&#xff0c;配置分为B1、B2、B3、B4、B5和B6六种&#xff0c;动力分为汽油…

2024年陕西省安全员B证证模拟考试题库及陕西省安全员B证理论考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年陕西省安全员B证证模拟考试题库及陕西省安全员B证理论考试试题是由安全生产模拟考试一点通提供&#xff0c;陕西省安全员B证证模拟考试题库是根据陕西省安全员B证最新版教材&#xff0c;陕西省安全员B证大纲整理…

C语言 | Leetcode C语言题解之第424题替换后的最长重复字符

题目&#xff1a; 题解&#xff1a; int characterReplacement(char* s, int k) {int num[26];memset(num, 0, sizeof(num));int n strlen(s);int maxn 0;int left 0, right 0;while (right < n) {num[s[right] - A];maxn fmax(maxn, num[s[right] - A]);if (right - …

Oracle日常运维(一线DBA必备技能)(二)

List item 本篇接上篇&#xff0c;接着介绍Oracle DB几类重要文件的日常管理&#xff0c;和作为DBA需要掌握针对这些文件的哪些操作。本篇将重点介绍参数文件和控制文件&#xff0c;数据文件是和业务息息相关的文件&#xff0c;在后续的数据库备份恢复&#xff0c;优化篇将会针…

【Spring Cloud Alibaba】Nacos

【Spring Cloud Alibaba】Nacos 1. 什么是Nacos&#xff0c;它都能干什么&#xff1f;1.1 注册中心演变及其思想1.2 Nacos Discovery1.3 远程调用流程图1.4 一个微服务的流程1.4 常用注册中心对比 2. Nacos Server部署3. Nacos Client搭建附录 1. 什么是Nacos&#xff0c;它都能…

【机器学习】11——矩阵求导

机器学习11——矩阵求导 打公式不太好标注&#xff0c;全图警告&#xff01;&#xff01;&#xff01; 文章目录 机器学习11——矩阵求导1.1标量对向量1.2标量对矩阵2.1向量对标量2.2向量对向量2.3向量对矩阵 1.1标量对向量 1.2标量对矩阵 X是m*n的矩阵&#xff0c;不严谨&am…

鸿蒙OpenHarmony【轻量系统内核扩展组件(C++支持)】子系统开发

C支持 基本概念 C作为目前使用最广泛的编程语言之一&#xff0c;支持类、封装、重载等特性&#xff0c;是在C语言基础上开发的一种面向对象的编程语言。 运行机制 C代码的识别主要由编译器支持&#xff0c;系统主要对全局对象进行构造函数调用&#xff0c;进行初始化操作。…

数字病理图像处理:分割、合成与数据增强研究|顶刊精析·24-09-20

小罗碎碎念 今日精析&#xff1a;Medical Image Analysis 这篇文章介绍了一种结合了先进分割模型和生成对抗网络的病理切片图像分析流程&#xff0c;用于提高癌症诊断的准确性和效率。 作者角色姓名单位名称&#xff08;中文&#xff09;第一作者Muhammad Jehanzaib博阿齐奇大学…