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 相关文章推荐
基于jquery的一行代码轻松实现拖动效果
Dec 28 Javascript
jquery 动态创建元素的方式介绍及应用
Apr 21 Javascript
JS是按值传递还是按引用传递
Jan 30 Javascript
简要了解jQuery移动web开发的响应式布局设计
Dec 04 Javascript
Validform+layer实现漂亮的表单验证特效
Jan 17 Javascript
jQuery基于json与cookie实现购物车的方法
Apr 15 Javascript
JavaScript和jquery获取父级元素、子级元素、兄弟元素的方法
Jun 05 Javascript
jQuery Raty 一款不错的星级评分插件
Aug 24 Javascript
layui监听工具栏的实例(操作列表按钮)
Sep 10 Javascript
node.js域名解析实现方法详解
Nov 05 Javascript
Vue3为什么这么快
Sep 23 Javascript
微信小程序自定义tabBar的踩坑实践记录
Nov 06 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 分库分表hash算法
2009/11/12 PHP
PHPAnalysis中文分词类详解
2014/06/13 PHP
php实现的短网址算法分享
2014/06/20 PHP
详解PHP的Yii框架中组件行为的属性注入和方法注入
2016/03/18 PHP
php 使用curl模拟ip和来源进行访问的实现方法
2017/05/02 PHP
thinkphp 5框架实现登陆,登出及session登陆状态检测功能示例
2019/10/10 PHP
javascript 添加和移除函数的通用方法
2009/10/20 Javascript
javascript onmouseout 解决办法
2010/07/17 Javascript
jQuery实现自动滚动到页面顶端的方法
2015/05/22 Javascript
jQuery地图map悬停显示省市代码分享
2015/08/20 Javascript
深入理解vue.js双向绑定的实现原理
2016/12/05 Javascript
详解微信图片防盗链“此图片来自微信公众平台 未经允许不得引用”的解决方案
2019/04/04 Javascript
koa+jwt实现token验证与刷新功能
2019/05/30 Javascript
Javascript幻灯片播放功能实现过程解析
2020/05/07 Javascript
原生JavaScript实现拖动校验功能
2020/09/29 Javascript
Python实现各种排序算法的代码示例总结
2015/12/11 Python
Python3.5基础之函数的定义与使用实例详解【参数、作用域、递归、重载等】
2019/04/26 Python
python语言线程标准库threading.local解读总结
2019/11/10 Python
Python内置加密模块用法解析
2019/11/25 Python
python GUI库图形界面开发之PyQt5信号与槽的高级使用技巧(自定义信号与槽)详解与实例
2020/03/06 Python
使用Keras预训练好的模型进行目标类别预测详解
2020/06/27 Python
基于Python爬取搜狐证券股票过程解析
2020/11/18 Python
基于html5实现的图片墙效果
2014/10/16 HTML / CSS
采用专利算法搜索最廉价的机票:CheapAir
2016/09/10 全球购物
中国领先的专业家电网购平台:国美在线
2016/12/25 全球购物
Oracle里面常用的数据字典有哪些
2014/02/14 面试题
Oracle中delete,truncate和drop的区别
2016/05/05 面试题
用Java语言将一个键盘输入的数字转化成中文输出
2013/01/25 面试题
通信工程毕业生求职信
2013/11/16 职场文书
会计助理的岗位职责
2013/11/29 职场文书
《千年梦圆在今朝》教学反思
2014/02/24 职场文书
银行保安拾金不昧表扬稿
2015/05/05 职场文书
《田忌赛马》教学反思
2016/02/19 职场文书
golang interface判断为空nil的实现代码
2021/04/24 Golang
php中配置文件保存修改操作 如config.php文件的读取修改等操作
2021/05/12 PHP
UNION CREATIVE《Re:从零开始的异世界生活》雷姆手办
2022/03/20 日漫