【开发心得】electon vue updater自动升级完整步骤与样例

前言: 之前的博文中预告了会在近期进行关于"electron-vue autoUpdater"完整案例的编写。这里兑现承诺。

直接先贴一下可用的git地址。

https://gitee.com/sun577586587/electron-vue-updater

测试的时候,请自行搭建http://localhost:8000/download/win的路径。(暂时不详细说明测试步骤,找时间补充个gif或者小视频吧,有问题欢迎先在评论讨论) 

环境:

一、从零创建项目

1.新建项目

 vue init simulatedgreg/electron-vue electrom-vue-update

2.进入项目路径

cd electrom-vue-update/

3. yarn(或者npm install),安装下依赖

4. yarn dev (或者 npm run dev), 启动严重下

5. 安装element-ui

npm install element-ui -s

踩坑与处理:

Q1:启动报错,提示“task重复定义”

感谢原博主:

https://www.cnblogs.com/silverbeats/p/14945112.html

1 打包踩坑#

1.1 .Election-vue/build.js文件的坑#

1.1.1 重复定义task变量#

image

可以知道打包时为什么会报这个错误了。

// 将上面的那个task变量改为task1,简单些
const tasks1 = ['main', 'renderer']
const m = new Multispinner(tasks1, {
	preText: 'building',
	postText: 'process'
})

1.1.2 找不到Multispinner依赖#

还是上图,可以看到图片中的第二行使用了Multispinner对象,在初始化项目时,是不会下载Multispinner相关依赖的,需要自行yarn或npm下载,并且导入一下

yarn add multispinner
npm install multispinner
const Multispinner = require('multispinner')

Q2:Cannot read property 'name' of undefined

"electron": "^2.0.4"  默认electron-vue的electron版本属实有点低。截止2021.07.04 最新版本
13.1.5 注意升级下,先删除node module中的electron,重新命令行安装,或者直接package.json中修改版本,然后重新yarn (npm install)
npm install electron -g

备选:安装logger 

npm install logger --save

二、自动更新

1.package.json 增加发布相关。(如果使用其他方式,可以在vue.config.js或者background.js中放置)

 "publish": [
      {
        "provider": "generic",
        "url": "http://localhost:8000/api/download/test/win" # 改成你具体的地址
      }
    ],

2. 编写upgrade.js(叫其他名称也行,只要在引入的时候引入正确就行)

import { autoUpdater } from 'electron-updater'
import { ipcMain } from 'electron'

let mainWindow = null
let globalSettings
// 给渲染进程发送消息
function sendUpdateMessage (text) {
  mainWindow.webContents.send('message', text)
}

export function upgradeAutoUpdaterHandle (feedUrl) {
  autoUpdater.setFeedURL(feedUrl)
  autoUpdater.checkForUpdates()
}

export function initAutoUpdaterHandle (window, settings, feedUrl) {
  mainWindow = window
  globalSettings = settings
  // 设置更新包的地址
  autoUpdater.setFeedURL(feedUrl)
  autoUpdater.on('error', (error) => {
    sendUpdateMessage({
      cmd: 'error',
      message: error
    })
  })
  // 监听开始检测更新事件
  autoUpdater.on('checking-for-update', (message) => {
    sendUpdateMessage({
      cmd: 'checking-for-update',
      message
    })
  })
  // 监听发现可用更新事件
  autoUpdater.on('update-available', (message) => {
    sendUpdateMessage({
      cmd: 'update-available',
      message
    })
  })
  // 监听没有可用更新事件
  autoUpdater.on('update-not-available', (message) => {
    sendUpdateMessage({
      cmd: 'update-not-available',
      message
    })
  })

  // 更新下载进度事件
  autoUpdater.on('download-progress', (progressObj) => {
    sendUpdateMessage({
      cmd: 'download-progress',
      message: progressObj
    })
  })
  // 监听下载完成事件
  autoUpdater.on('update-downloaded', (event, releaseNotes, releaseName, releaseDate, updateUrl, quitAndUpdate) => {
    sendUpdateMessage({
      cmd: 'update-downloaded',
      message: {
        releaseNotes,
        releaseName,
        releaseDate,
        updateUrl,
        quitAndUpdate
      }
    })
  })

  // 开始更新安装
  ipcMain.on('upgradeVersion', () => {
    globalSettings.willQuitApp = true
    autoUpdater.quitAndInstall()
  })

  if (!globalSettings.isDevelopment) {
    autoUpdater.checkForUpdates()
  }
  // // 接收渲染进程消息,开始检查更新
  // ipcMain.on('checkForUpdate', () => {
  //   // 执行自动更新检查
  //   // sendUpdateMessage({cmd:'checkForUpdate',message:arg})
  //   logger.info('check for update');
  //   autoUpdater.checkForUpdates();
  // });
}

 

3.index.js引入

ipcMain.on('loginSuccess', (event, data) => {
  const feedUrl = `http://localhost:8000/download/win/`
  if (!globalSettings.uploaderInited) {
    initAutoUpdaterHandle(mainWindow, globalSettings, feedUrl)
    globalSettings.uploaderInited = true
  } else {
    upgradeAutoUpdaterHandle(feedUrl)
  }
})

4.app.vue

<template>
  <div id="app">
    <landing-page></landing-page>
    <el-dialog
        :title="dialogTitle"
        :visible.sync="dialogVisible"
        width="40%"
        :close-on-click-modal="closeOnClickModal"
        :close-on-press-escape="closeOnPressEscape"
        :show-close="showClose"
        center
    >
      <div style="width:100%;height:10vh;line-height:20vh;text-align:center">
        <el-progress
            status="success"
            :text-inside="true"
            :stroke-width="20"
            :percentage="percentage"
            :width="strokeWidth"
            :show-text="true"
        ></el-progress>
      </div>
      <div align="center">
        <el-button type=primary @click.prevent="upgrade" v-if="canUpgrade">更新</el-button>
        <el-button type=primary @click.prevent="upgradeLater"  v-if="canUpgradeLater">稍后</el-button>
      </div>
    </el-dialog>
  </div>
</template>

<script>
  import LandingPage from '@/components/LandingPage'
  import { ipcRenderer } from 'electron'
  export default {
    name: 'electrom-vue-update',
    components: {
      LandingPage
    },
    data () {
      return {
        dialogTitle: '正在更新新版本,请稍候...',
        dialogVisible: false,
        closeOnClickModal: false,
        closeOnPressEscape: false,
        showClose: false,
        canUpgrade: false,
        canUpgradeLater: false,
        percentage: 0,
        strokeWidth: 200
      }
    },
    methods: {
      upgrade () {
        ipcRenderer.send('upgradeVersion')
      },
      upgradeLater () {
        this.dialogVisible = false
      }
    },
    mounted () {
      ipcRenderer.on('message', (event, arg) => {
        if (arg.cmd === 'update-available') {
          this.dialogVisible = true
        } else if (arg.cmd === 'update-downloaded') {
          this.percentage = 100.0
          this.dialogVisible = '更新完成'
          this.canUpgrade = true
          this.canUpgradeLater = true
        } else if (arg.cmd === 'download-progress') {
          this.percentage = Math.round(parseFloat(arg.message.percent))
        } else if (arg.cmd === 'error') {
          this.dialogVisible = true
          this.canUpgradeLater = true
          this.dialogTitle = '版本更新错误,请和管理员联系'
        }
      })
      ipcRenderer.send('checkForUpdate')
    }
  }
</script>

<style>
  /* CSS */
</style>

 5. 合适的地方触发:

<script>
  import SystemInformation from './LandingPage/SystemInformation'
  import { ipcRenderer } from 'electron'
  export default {
    name: 'landing-page',
    components: { SystemInformation },
    methods: {
      open (link) {
        require('electron').shell.openExternal(link)
      },
      checkUpdate () {
        // 增加发送成功的数据 S
        ipcRenderer.send('loginSuccess', {
          loginAddress: 'http://localhost:8000/download/win/',
          loginUsername: 'root'
        })
      }
    },
    mounted () {
      this.checkUpdate()
    }
  }
</script>

附录: 

npm 与 yarn对比

npm                                     yarn

npm init                                yarn init              // 初始化
npm i | install                         yarn  (install)        // 安装依赖包
npm i x --S | --save                    yarn add  x            // 安装生产依赖并保存包名
npm i x --D | --save-dev                yarn add x -D          // 安装开发依赖并保存包名
npm un | uninstall  x                   yarn remove            // 删除依赖包
npm i -g | npm -g i x                   yarn global add x      // 全局安装
npm un -g x                             yarn global remove x   // 全局下载
npm run dev                             yarn dev | run dev     // 运行命令

原文地址:https://blog.csdn.net/qq_26834611/article/details/118461956

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


这篇文章主要讲解了“electron打包中的坑如何解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“electron...
这篇文章主要介绍“electron打包的坑如何解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“electron打包的坑如何...
这篇文章主要为大家分析了VSCode中如何调试Electron应用的主进程代码的相关知识点,内容详细易懂,操作细节合理,具有一定参考价值。如果感兴趣的话,不妨跟着跟...
这篇“如何在VSCode上调试Electron应用的主进程代码”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价
vue-cli+electron一种新的脚手架(vue-electron)vue-electron主要业务逻辑都放在src下的renderer文件夹内,和之前的vue-cli搭建项目流程没有任何区别 GIT地址:https://github.com/SimulatedGREG/electron-vue 搭建项目:1.全局安装脚手架:npminstall--globalvue-cli
1、首先成功安装Node.js。2、配置好环境变量path,参加上一篇博客《NodeJs安装》3、全局安装electron,并测试。如下图
相关代码:https://github.com/WozHuang/Barrage-helper/blob/master/src/main/index.dev.js在SPA逐渐成为构建优秀交互体验应用的主流方式后,使用Electron开发跨平台的软件是一个优秀的解决方案。下面简单介绍一下Electron-vue安装vue-devtool的方式。安装步骤下载vue-de
前言本人是做java开发的(菜鸟),做web项目的朋友们基本上都会遇到同样一个,永远不知道客户会怎么样使用,或者说永远不知道客户会用什么浏览器打开我们做出来的应用,就算你跟他说明了一定得用某某某浏览器打开,还是有人会用别的浏览器打开,这种情况通常我们会去做适配(前端),最近公司有需求
electron-builder是将electron做的桌面应用打包成安装包的插件。一、安装使用yarn安装,使用npm安装的有问题(没有尝试),先安装yarn工具。npminstall-gyarn安装electron-builderyarnaddelectron-builder--save-dev二、配置在package.json 中配置"build":{
来源:https:/ewsn.net/say/electron-asar.html 在electron中,asar是个特殊的代码格式。asar包里面包含了程序猿编写的代码逻辑。默认情况下,这些代码逻辑,是放置在resource/app目录下面的,明文可见,这样的话,也就有了代码加密(asar打包)的需求 asar如何解密加密?electron的asar的
 字体图标丢失问题解决方案 重新打包文件npmrunbuild再次运行electron 
<img:src="item.headUrl"alt=""class="contact-head":onerror="morenImage">data(){return{morenImage:'this.src="static/image/head.png"',//默认头像}}
在electron-vue中使用了字体图标,但是打包成.exe文件后图标不显示,路劲问题把字体图标放到static目录下就可以了,静态图片也一样我原来放在其它地方不行改到static目录就可以了
//设置登录cookiesetCookie(name,value){varDays=30;varexp=newDate();vardate=Math.round(exp.getTime()/1000)+Days*24*60*60;constcookie={url:this.webApi,name:name,value:value,e
vue部分cnpminstall-gvue-clivueinitsimulatedgreg/electron-vuemy-projectelectron下载失败解决办法:单独设置electron为淘宝镜像,npmconfigsetelectron_mirrorhttps:/pm.taobao.org/mirrors/electron/yarnconfigsetelectron_mirrorhttps:/pm.taobao.org
原始的方式打包下载对应的版本号的ReleaseElectron然后把对应的项目方便整理成这样的目录结构(Windows下)node_modules重新安装,不然可能启动失败把整文件夹给别人就可以了如果想改名子可以用改名工具rcedit应用程序打包成一个文件为了缓解windows路径名过长的问题(就
窗口间通信的问题electron窗口通信比nwjs要麻烦的多electron分主进程和渲染进程,渲染进程又分主窗口的渲染进程和子窗口的渲染进程主窗口的渲染进程给子窗口的渲染进程发消息1234567891011subWin.webContents.on('dom-ready', () => {    subWin.webCo
按照上一个问题here,我有一个使用Electron平台和Javascript的桌面应用程序,我使用以下方法将HTML5画布转换为JPEG:<aid="download"download="Path.jpg">DownloadJPG</a>然后,functiondownload(){vardt=canvas.toDataURL('image/jpeg');this.href
一.什么是Electron?它和NW.js的区别是什么?Electron是GitHub开发的桌面应用开发框架,它支持使用HTML、CSS、JavaScript来构建跨平台的桌面应用。Electron和NW.js(NW.js是什么可以百度下)的区别是:1.整合Chromium和Node.js的方式不同。在NW.js中,Chromium是直接被打补丁打进去
1.打开父子模态创建,<button@click="showModalHandler">父子模态窗口</button>/enderer渲染器中主注册事件showModalHandler(){ipcRenderer.send("child-down-modal");}//主进程中触发事件/***父子模态窗口*/letchildDownModal;ipcMain.on(&#