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

news2024/12/24 10:04:29

在 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.coloradmin.cn/o/2141397.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MiniBlogum项目简介

MiniBlogum项目简介 文章目录 MiniBlogum项目简介一、引言二、技术栈与开发环境三、主要功能&#xff08;一&#xff09;用户注册与登录&#xff08;二&#xff09;查看当前登录用户/作者头像、昵称、Gitee仓库地址&#xff08;三&#xff09;查看博客列表&#xff08;四&#…

HAL库STM32常用外设教程(四)—— 定时器 基本定时

HAL库STM32常用外设教程&#xff08;四&#xff09;—— 定时器 基本定时 文章目录 HAL库STM32常用外设教程&#xff08;四&#xff09;—— 定时器 基本定时前言一、定时器特性概述二、基础定时器的结构和功能1、基本特征2、基础定时器相关寄存器3、基础定时器工作流程4、基础…

基于python+django+vue的家居全屋定制系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于协同过滤pythondjangovue…

文件误删除后的数据救援实战指南

在数字化时代&#xff0c;文件误删除成为了许多用户心头挥之不去的阴影。无论是手误点击了“删除”键&#xff0c;还是系统崩溃导致的数据丢失&#xff0c;文件一旦从我们的视线中消失&#xff0c;往往伴随着重要信息的流失和工作的中断。本文将深入探讨文件误删除的现象&#…

kubernetes技术详解,带你深入了解k8s

目录 一、Kubernetes简介 1.1 容器编排应用 1.2 Kubernetes简介 1.3 k8s的设计架构 1.3.1 k8s各个组件的用途 1.3.2 k8s各组件之间的调用关系 1.3.3 k8s的常用名词概念 1.3.4 k8s的分层结构 二、k8s集群环境搭建 2.1 k8s中容器的管理方式 2.2 k8s环境部署 2.2.1 禁用…

如何在GitHub上克隆仓库:HTTPS、SSH和GitHub CLI的区别

GitHub是开发者的天堂&#xff0c;提供了丰富的工具和功能来管理代码和项目。在克隆GitHub仓库时&#xff0c;你可能会遇到三种常见的方法&#xff1a;HTTPS、SSH和GitHub CLI。每种方法都有其独特的优势和适用场景。本文将深入探讨这三种克隆方式的区别&#xff0c;帮助你选择…

AI助力遥感影像智能分析计算,基于高精度YOLOv5全系列参数【n/s/m/l/x】模型开发构建卫星遥感拍摄场景下地面建筑物智能化分割检测识别系统

随着科技的飞速发展&#xff0c;卫星遥感技术已成为获取地球表面信息的重要手段之一。卫星遥感图像以其覆盖范围广、数据量大、信息丰富等特点&#xff0c;在环境监测、城市规划、灾害评估等多个领域发挥着不可替代的作用。然而&#xff0c;面对海量的卫星图像数据&#xff0c;…

react hooks--useLayoutEffect

概述 ◼ useLayoutEffect看起来和useEffect非常的相似&#xff0c;事实上他们也只有一点区别而已&#xff1a;  useEffect会在渲染的内容更新到DOM上后执行&#xff0c;不会阻塞DOM的更新&#xff1b;  useLayoutEffect会在渲染的内容更新到DOM上之前执行&#xff0c;会…

JUC学习笔记(二)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 四、共享模型之内存4.1 Java 内存模型4.2 可见性退不出的循环解决方法可见性 vs 原子性模式之 Balking1.定义2.实现 4.3 有序性原理之指令级并行1. 名词2.鱼罐头的故…

STM32巡回研讨会总结(2024)

前言 本次ST公司可以说是推出了7大方面&#xff0c;几乎可以说是覆盖到了目前生活中的方方面面&#xff0c;下面总结下我的感受。无线类 支持多种调制模式&#xff08;LoRa、(G)FSK、(G)MSK 和 BPSK&#xff09;满足工业和消费物联网 (IoT) 中各种低功耗广域网 (LPWAN) 无线应…

【Android 13源码分析】WindowContainer窗口层级-4-Layer树

在安卓源码的设计中&#xff0c;将将屏幕分为了37层&#xff0c;不同的窗口将在不同的层级中显示。 对这一块的概念以及相关源码做了详细分析&#xff0c;整理出以下几篇。 【Android 13源码分析】WindowContainer窗口层级-1-初识窗口层级树 【Android 13源码分析】WindowCon…

计算机的错误计算(九十五)

摘要 从计算机的错误计算&#xff08;八十六&#xff09;至&#xff08;九十四&#xff09;&#xff0c;其主题均涉及对数运算。本节用错数解释&#xff08;九十四&#xff09;中的错误计算的原因。其余类似。 首先&#xff0c;由计算机的错误计算&#xff08;二十七&#xf…

QUIC的loss detection学习

PTO backoff backoff 补偿 /ˈbkɒf/PTO backoff 是QUIC&#xff08;Quick UDP Internet Connections&#xff09;协议中的一种机制&#xff0c;用于处理探测超时&#xff08;Probe Timeout, PTO&#xff09;重传策略 它逐步增加探测超时的等待时间&#xff0c;以避免网络拥塞…

外网(公网)访问VMware workstation 虚拟机内web网站的配置方法---端口转发总是不成功的原因

问题背景&#xff1a;客户提供的服务器操作系统配置web程序时&#xff0c;总是显示莫名其妙的问题&#xff0c;发现是高版本操作系统的.net库已经对低版本.net库进行了大范围修订&#xff0c;导致在安全检测上、软件代码规范上更加苛刻&#xff0c;最终导致部署不成功。于是想到…

使用Qt 搭建简单雷达

目录 1.简易雷达图思维导图 2.结果展示图 3.制作流程 3.1表盘的绘制 3.1.1 绘制底色 ​编辑 3.1.2 绘制大圆 3.3.3绘制小圆 3.3.4 绘制小圆的内容 3.3.5 绘制表盘刻度和数字标注 3.3.6 绘制指针 3.3.7 绘制扇形 3.2 设置定时器让表盘动起来 3.3.1 设置动态指针…

Excel图片批量插入单元格排版处理插件【图片大师】

为了方便大家在图片的插入排版的重复工作中解放出来&#xff0c;最近发布了一款批量插入图片的插件&#xff0c;欢迎大家下载&#xff0c;免费试用。 这是图片的文件夹&#xff1a; 主要功能如下: 1&#xff0c;匹配单元格名称的多张图批量插入到一个单元格 该功能支持设置图…

【1.使用Index和Match函数自动补全内容】

目录 前言如何利用函数自动填充内容效果学会使用的方法(文字图片版本)只管使用&#xff0c;不看原理原理解读MATCH函数INDEX函数组合 学会使用的方法(视频版本) 后言最后想说的话 前言 如何利用函数自动填充内容 先说结论&#xff0c;本文的目的是通过使用Excel的函数&#xf…

深度强化学习Reinforcement Learning|PG|Actor-Critic|A3C|DDPG

目录 一、PG(Policy Gradient)策略梯度算法&#xff08;on-policy&#xff09; 1、策略梯度公式推导 2、代码讲解/伪代码 3、改进 3.1Trick Baseline 3.2 Suitable Credit 二、Actor-Critic算法 三、A3C算法 四、DDPG算法 前言 我们都知道强化学习环境env的不确定性是…

TCP协议分析《实验报告》

一、实验目的 1、理解TCP协议&#xff1b; 2、掌握TCP协议三次握手建立连接和四次挥手释放连接的过程&#xff1b; 3、理解TELNET协议及工作过程&#xff1b; 4、掌握TCP协议分析方法。 二、实验设备和环境 1、硬件设备&#xff1a;PC机或笔记本电脑&#xff1b; 2、软件…

Matlab simulink建模与仿真 第十七章(补充离散库和补充数学库)

参考视频&#xff1a;simulink1.1simulink简介_哔哩哔哩_bilibili 一、补充离散库和补充数学库中的模块概览 1、补充离散库 注&#xff1a;每个版本的补充离散库不一定相同&#xff0c;也不是每个版本的库都有如上所有模块。 2、补充数学库 二、离散直接传递函数Ⅱ模块 1、…