Electron实现应用打包、自动升级过程解析


Posted in Javascript onJuly 07, 2020

上次成功搭建了vue + electron的helloworld程序,这次将electron应用打包及自动升级的流程梳理了一下。

1. 应用打包

使用electron builder打包只需要在vue.config.js中配置即可,这里需要注意的是,默认情况下electron builder打包出来的安装程序是不能修改安装目录的,需要allowToChangeInstallationDirectory这个配置设置为true。

// see https://cli.vuejs.org/config
module.exports = {
 productionSourceMap: false,
 pluginOptions: {
  electronBuilder: {
   nodeIntegration: true,
   builderOptions: {
    appId: 'com.itqn.electron.helloworld',
    productName: 'helloworld',
    // see https://www.electron.build/configuration/publish#genericserveroptions
    publish: {
     provider: 'generic',
     url: 'http://192.168.1.100/itqn/electron/helloworld'
    },
    win: {
     // must be at least 256x256
     icon: './public/favicon.ico'
    },  
    asar: false,
    nsis: {
     oneClick: false,
     // 允许修改安装目录
     allowToChangeInstallationDirectory: true, 
     allowElevation: true,
     createDesktopShortcut: true,
     createStartMenuShortcut: true,
     shortcutName: 'helloworld'
    }
   }
  },
  configureWebpack: {
   resolve: {
    symlinks: true
   }
  }
 }
}

接着执行下面的命令进行应用打包

npm run electron:build

如果成功打包,将为在项目的dist_electron目录中生成对应的exe。

打包过程中可能出现favicon.icon must be at least 256x256的错误,这里需要在网上用工具将icon转化为256x256的即可。

2. 自动升级

使用electron的自动升级功能,需要安装electron-updater这个依赖,这里只是开发时用到,所以使用-D安装。

npm install electron-updater -D

编写更新程序update.js

import { dialog } from 'electron'
import { autoUpdater } from 'electron-updater'
import http from 'http'

// see https://www.electron.build/auto-update#events
autoUpdater.on('update-downloaded', info => {
 if (process.env.NODE_ENV === 'production') {
  // https://electronjs.org/docs/api/auto-updater#autoupdaterquitandinstall
  // 这里先拉取更新信息,在对话框中显示版本的更新内容
  const req = http.request('http://192.168.1.3/itqn/electron/helloworld/info.txt', req => {
   let detail = ''
   req.setEncoding('utf-8')
   req.on('data', chunk => {
    detail += chunk.toString()
   })
   req.on('end', () => {
    dialog.showMessageBox(
     {
      icon: __static + '/favicon.png',
      type: 'info',
      title: '软件更新',
      message: `已更新到最新版本(${info.version})请重启应用。`,
      detail: detail,
      buttons: ['确定']
     },
     idx => {
      // 点击确定的时候执行更新
      if (idx === 0) {
       autoUpdater.quitAndInstall()
      }
     }
    )
   })
  })
  req.end()
 }
})
export default autoUpdater

然后在程序启动的时候进行版本检测,如果有新版会自动更新。

在background.js中引入update.js,并在ready事件中检测版本。

import autoUpdater from './update'
app.on('ready', async () => {
 // 这里只在生产环境才执行版本检测。
 if (process.env.NODE_ENV === 'production') {
  autoUpdater.checkForUpdates()
 }
 createWindow()
})

这样,Electron桌面应用程序就支持在线自动更新了,下面将使用nginx进行自动更新测试。

3. 升级测试

默认情况下,创建应用的版本为0.1.0,这里测试应用从0.1.0自动升级为0.1.1。

安装 0.1.0 版本

为了测试应用自动更新,需要在本地安装一个0.1.0版本,将应用打包成exe,然后安装在自己的电脑上。

升级版本为 0.1.1

将应用升级为 0.1.1 版本,只需要将package.json中的版本号更新为0.1.1即可。

{
 "name": "electron-helloworld",
 "version": "0.1.1",
}

这里为了测试方便,可以在Helloworld.vue中加入版本,或者读取应用版本号。

<div>{{txt}}</div>
<button @click="readTxt">读取文件信息</button>
<div>v0.1.1</div>

重新打包应用,打包成功后dist_electron目录中会多出几个文件,下面这三个是升级需要用到的:

helloworld Setup 0.1.1.exe
helloworld Setup 0.1.1.exe.blockmap
latest.yml

发布新版本 0.1.1

新版本打包后需要发布到服务器中,这里可以使用nginx做为服务器。

需要注意的是,应用程序中指定的服务器更新地址为:

http://192.168.1.3/itqn/electron/helloworld

所以必须将应用发布到这里,才能实现自动升级(这里我使用的是本地IP,实际使用应该是用域名)。

使用nginx作为服务器,需要在本地安装nginx,可以在官网下载nginx,解压即可。

修改nginx的配置conf/nginx.conf

http {
 server {
  listen 80;
  location / {
   root D:/nginx/www;
  }
 }
}

这里指定了nginx的root为D:/nginx/www,所以需要在www这个目录下创建itqn/electron/helloworld这个目录,最终的目录路径为:

D:\nginx\www\itqn\electron\helloworld

将新版本打包的三个文件放到helloworld这个目录中,然后新增一个info.txt文件编写更新内容,最后helloworld目录下的文件如下:

helloworld Setup 0.1.1.exe
helloworld Setup 0.1.1.exe.blockmap
latest.yml
info.txt

启动nginx服务器

start nginx.exe

如果服务启动正常,通过浏览器访问<http://192.168.1.3/itqn/electron/helloworld/info.txt>将可以看到更新内容。

最后启动已经安装好0.1.0程序。

Electron实现应用打包、自动升级过程解析

可以看到程序启动后,弹出了新版本的更新内容,这里点击确定执行更新,更新成功后会自动重启应用。

下面是更新后的界面,可以看到应用已经更新到了最新版本0.1.1。

Electron实现应用打包、自动升级过程解析

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript 关键字屏蔽实现函数
Aug 02 Javascript
javascript 正则替换 replace(regExp, function)用法
May 22 Javascript
让mayfish支持mysqli数据库驱动的实现方法
May 22 Javascript
通过继承IHttpHandle实现JS插件的组织与管理
Jul 13 Javascript
关于Ext中form移除textfield方法:hide(),setVisible(false),remove()
Dec 02 Javascript
js中的前绑定和后绑定详解
Aug 01 Javascript
js、jquery图片动画、动态切换示例代码
Jun 03 Javascript
详解JavaScript正则表达式中的global属性的使用
Jun 16 Javascript
jQuery简单动画变换效果实例分析
Jul 04 Javascript
vue this.reload 方法 配置
Sep 12 Javascript
vue使用vant中的checkbox实现全选功能
Nov 17 Vue.js
vue 在服务器端直接修改请求的接口地址
Dec 19 Vue.js
基于Electron实现桌面应用开发代码实例
Jul 07 #Javascript
基于javascript处理nginx请求过程详解
Jul 07 #Javascript
vue-i18n实现中英文切换的方法
Jul 06 #Javascript
vue 实现动态路由的方法
Jul 06 #Javascript
Nuxt配置Element-UI按需引入的操作方法
Jul 06 #Javascript
解决Nuxt使用axios跨域问题
Jul 06 #Javascript
js实现星星打分效果
Jul 05 #Javascript
You might like
PHP新手上路(三)
2006/10/09 PHP
Yii2前后台分离及migrate使用(七)
2016/05/04 PHP
PHP封装的PDO数据库操作类实例
2017/06/21 PHP
PHP设计模式之原型模式定义与用法详解
2018/04/03 PHP
符合标准的js表单提交的代码
2007/09/13 Javascript
jQuery判断iframe中元素是否存在的方法
2013/05/11 Javascript
JavaScript实现复制内容到粘贴板代码
2016/03/31 Javascript
Js获取图片原始宽高的实现代码
2016/05/17 Javascript
js判断价格,必须为数字且不能为负数的实现方法
2016/10/07 Javascript
webpack常用配置项配置文件介绍
2016/11/07 Javascript
jQuery加载及解析XML文件的方法实例分析
2017/01/22 Javascript
jquery easyui DataGrid简单示例
2017/01/23 Javascript
利用Plupload.js解决大文件上传问题, 带进度条和背景遮罩层
2017/03/15 Javascript
nodejs个人博客开发第四步 数据模型
2017/04/12 NodeJs
JavaScript编程设计模式之观察者模式(Observer Pattern)实例详解
2017/10/25 Javascript
Windows下支持自动更新的Electron应用脚手架的方法
2018/12/24 Javascript
javascript设计模式 ? 策略模式原理与用法实例分析
2020/04/21 Javascript
在Vue中使用CSS3实现内容无缝滚动的示例代码
2020/11/27 Vue.js
用Python编写一个每天都在系统下新建一个文件夹的脚本
2015/05/04 Python
Python中的os.path路径模块中的操作方法总结
2016/07/07 Python
详解Python中的文件操作
2016/08/28 Python
python做量化投资系列之比特币初始配置
2018/01/23 Python
Python实现简单遗传算法(SGA)
2018/01/29 Python
python 保存float类型的小数的位数方法
2018/10/17 Python
tesserocr与pytesseract模块的使用方法解析
2019/08/30 Python
python批量将excel内容进行翻译写入功能
2019/10/10 Python
python 实现查询Neo4j多节点的多层关系
2019/12/23 Python
Django 解决distinct无法去除重复数据的问题
2020/05/20 Python
详解Pycharm第三方库的安装及使用方法
2020/12/29 Python
Aeropostale官网:美国著名校园品牌及青少年服饰品牌
2019/03/21 全球购物
俄罗斯运动、健康和美容产品在线商店:Lactomin.ru
2020/07/23 全球购物
教师个人剖析材料
2014/02/05 职场文书
推广普通话标语
2014/06/27 职场文书
党的群众路线对照检查材料(个人)
2014/09/24 职场文书
12.4法制宣传日标语
2014/10/08 职场文书
小学教师求职信范文
2015/03/20 职场文书