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 相关文章推荐
缓动函数requestAnimationFrame 更好的实现浏览器经动画
Dec 07 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(二)人物行走的实现
Jan 23 Javascript
表单元素与非表单元素刷新区别详细解析
Nov 06 Javascript
JavaScript替换当前页面的方法
Apr 03 Javascript
Node.js的文件权限及读写flag详解
Oct 11 Javascript
AngularJS中directive指令使用之事件绑定与指令交互用法示例
Nov 22 Javascript
原生js实现查询天气小应用
Dec 09 Javascript
NPM 安装cordova时警告:npm WARN deprecated minimatch@2.0.10: Please update to minimatch 3.0.2 or higher to
Dec 20 Javascript
从零开始学习Node.js系列教程二:文本提交与显示方法
Apr 13 Javascript
解决vue点击控制单个样式的问题
Sep 05 Javascript
微信小程序实现单个卡片左滑显示按钮并防止上下滑动干扰功能
Dec 06 Javascript
全局安装 Vue cli3 和 继续使用 Vue-cli2.x操作
Sep 08 Javascript
基于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函数memory_get_usage获取PHP内存清耗量的方法
2011/12/06 PHP
PHP防止跨域提交表单
2013/11/01 PHP
PHP中大于2038年时间戳的问题处理方案
2015/03/03 PHP
Mac版PhpStorm之XAMPP整合apache服务器配置的图文教程详解
2016/10/13 PHP
PHP用mysql_insert_id()函数获得刚插入数据或当前发布文章的ID
2016/11/25 PHP
php从身份证获取性别和出生年月
2017/02/09 PHP
PHP自动载入类文件函数__autoload的使用方法
2019/03/25 PHP
JavaScript中的对象化编程
2008/01/16 Javascript
自己的js工具 Event封装
2009/08/21 Javascript
JavaScript中使用正则匹配多条,且获取每条中的分组数据
2010/11/30 Javascript
用Juery网页选项卡实现代码
2011/06/13 Javascript
jQuery Validate插件实现表单强大的验证功能
2015/12/18 Javascript
JSON与String互转的实现方法(Javascript)
2016/09/27 Javascript
jquery实现手机端单店铺购物车结算删除功能
2017/02/22 Javascript
基于bootstrop常用类总结(推荐)
2017/09/11 Javascript
Vue+Jwt+SpringBoot+Ldap完成登录认证的示例代码
2018/05/21 Javascript
JS使用iView的Dropdown实现一个右键菜单
2019/05/06 Javascript
微信小程序在text文本实现多种字体样式
2019/11/08 Javascript
Vue设置长时间未操作登录自动到期返回登录页
2020/01/22 Javascript
[11:01]2014DOTA2西雅图邀请赛 冷冷带你探秘威斯汀
2014/07/08 DOTA
python单元测试unittest实例详解
2015/05/11 Python
Python + selenium自动化环境搭建的完整步骤
2018/05/19 Python
Python读取excel指定列生成指定sql脚本的方法
2018/11/28 Python
浅谈Python小波分析库Pywavelets的一点使用心得
2019/07/09 Python
浅谈python图片处理Image和skimage的区别
2019/08/04 Python
python能在浏览器能运行吗
2020/06/17 Python
教你如何用python操作摄像头以及对视频流的处理
2020/10/12 Python
Python 内存管理机制全面分析
2021/01/16 Python
详解Python爬虫爬取博客园问题列表所有的问题
2021/01/18 Python
CSS3制作翻转效果_动力节点Java学院整理
2017/07/11 HTML / CSS
巴黎卡诗美国官方网站:始于1964年的头发头皮护理专家
2017/07/10 全球购物
internal修饰符起什么作用
2013/12/16 面试题
市场营销管理毕业生自荐信
2014/03/03 职场文书
导游词之山东八仙过海景区
2019/11/11 职场文书
java中用float时,数字后面加f,这样是为什么你知道吗
2021/09/04 Java/Android
MySQL 条件查询的常用操作
2022/04/28 MySQL