桌面应用程序的更新逻辑一般为:启动–检测版本号–有更新–下载新版本资源包–解压–替换文件–重启;

1.为了更加直观,请看5毛钱特效:

2.本文案例主要用nwjs,其他框架升级原理同理。updater.exe主要是为了解决升级过程中资源占用问题。它只负责解压zip资源包至指定目录,并且在解压完成后,打开指定exe以启动项目,完成升级。

3.updater.exe的注意点:

1.跨平台 2.不依赖客户端任何资源(避免资源占用问题)

4.本案例用GO语言构建updater.exe,来实现nwjs构建的桌面应用的全量升级操作。效果如下:


5.nwjs客户端页面

<!DOCTYPE html>
<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><title>hello world</title><script>//更新相关var APP_CONFIG = {version: 'v1.0.0'}var win = nw.Window.get();function quit() {win.close(true);}</script>
</head><body style="background:#2b7bff;color:#ffffff;"><div style="width: 100%;height: 100%;text-align: center;margin-top: 150px;"><h1>Hello,World!</h1><p>当前版本:<span id="app-version"></span></p><p id="new-nav" style="display: none;">新版本更新:<span id="app-new-version"></span> 下载进度<span id="loading"></span></p><a style="margin-top: 50px; cursor: pointer;" onclick="quit();">退出</a></div>
</body>
<script>document.getElementById('app-version').innerHTML = APP_CONFIG.version;
</script>
<script src="/resource/update.js?v=2"></script>//这段js可以放在服务器端,方便维护
</html>

update.js可以放在服务器端,方便后期维护

6.update.js


let request = require('request');//先npm install request
let path = require('path');
let fs = require('fs');
let os = require('os');
let spawn = require('child_process').spawn;
var gui = require('nw.gui');let url = 'http://localhost:8080/new.zip';//新版本资源zip网络地址//简单的更新逻辑,资源包下载
if (window.APP_CONFIG.version != 'v1.0.1') {document.getElementById('new-nav').style.display = "block";document.getElementById('app-new-version').innerText = 'v1.0.1';var pkg = request(url, function (err, response) {if (err) {console.log(err);}if (response && (response.statusCode < 200 || response.statusCode >= 300)) {pkg.abort();}});pkg.on('response', function (response) {if (response && response.headers && response.headers['content-length']) {pkg['content-length'] = response.headers['content-length'];}});var tempDir = os.tmpdir();var filename = path.basename(url),destinationPath = path.join(tempDir, filename);console.log('filename', filename)console.log('tempDir', tempDir);// download the package to template folderfs.unlink(path.join(tempDir, filename), function () {pkg.pipe(fs.createWriteStream(destinationPath));pkg.resume();});let loaded = 0;pkg.on('data', chunk => {loaded += chunk.length;let loading = Math.floor(loaded / pkg['content-length'] * 100);console.log(loading);document.getElementById('loading').innerText = loading + '%';});pkg.on('error', (err) => {console.log(err);});pkg.on('end', appDownloaded);pkg.pause();function appDownloaded() {process.nextTick(function () {if (pkg.response.statusCode >= 200 && pkg.response.statusCode < 300) {console.log("ok")//下载完成后调用updater.exe解压至程序所在目录let udtPath = path.resolve(process.cwd(), "updater.exe");//当前应用目录console.log('udtPath:', udtPath);//destinationPath==zip文件所在的目录console.log('destinationPath', destinationPath);console.log(path.dirname(udtPath));var updateProcess = spawn('"' + udtPath + '"', ['--zip-path', '"' + destinationPath + '"','--dest-path', '"' + process.cwd() + '"','--app-name', 'nw.exe'], {cwd: path.dirname(udtPath),detached: true,stdio: 'ignore',shell: true,});updateProcess.unref();nw.App.quit();}});}
}

js包含了对资源包的下载,以及调用 updater.exe的步骤,请读代码。zip包是整个客户端所需要的文件,不能包含updater.exe。

总结:

本案例为了演示将updater.exe打包在客户端中,高级玩法可以将updater.exe放在服务器,有新版本更新的话,先下载updater.exe,再下载新版本资源包,然后完成解压重启的操作。这样做的优势:可以随时更新updater.exe的逻辑;比如想实现增量更新的话,修改updater.exe的逻辑实现按清单下载资源至客户端指定目录即可。

代码:
https://blog.csdn.net/u012981972/article/details/109616629

nwjs桌面应用升级方案 桌面应用更新 支持增量全量更新相关推荐

  1. Android中的全量更新、增量更新以及热更新

    在客户端开发过程中,我们可能会遇到这样一种需求:点击某个按钮弹出一个弹窗,提示我们可以更新到apk的某个版本,或者我们可以通过服务端接口进行强制更新.在这种需求中,我们是不需要通过应用商店来更新我们的 ...

  2. sorl的全量更新与增量更新

    solr 的全量更新与增量更新 solr的增量更新 全量更新 solr的增量更新 1.首先要弄懂几个必要的属性,以及数据库建表事项,和dataimporter.properties .data-con ...

  3. 全量更新和增量更新_增量BIOS更新或直接更新到最新版本哪个更好?

    全量更新和增量更新 There are few things as irritating as a Blue Screen of Death, but sometimes there is an ea ...

  4. MySQL 百万级/千万级表 全量更新

    业务需求:今天从生成测试环境迁移了一批百万级/千万级表的数据,领导要求将这批数据进行脱敏处理(将真实姓名 .电话.邮箱.身份证号等敏感信息进行替换).迁移数据记录数如下(小于百万级的全量更新不是本文重 ...

  5. 亿级流量电商详情页系统实战-28.商品详情页结构分析、缓存全量更新问题以及缓存维度化解决方案

    1.前言 实时性比较高的那块数据,比如说库存,销量之类的这种数据,我们采取的实时的缓存+数据库双写的技术方案,双写一致性保障的方案 实时性要求不高的数据,比如说商品的基本信息,等等,我们采取的是三级缓 ...

  6. bugly的全量更新与热更新

    bugly开发文档地址:https://bugly.qq.com/docs/introduction/app-upgrade-introduction/?v=20180709165613: 我们在使用 ...

  7. 基于间隔推送全量更新数据状态的设计方法

    2019独角兽企业重金招聘Python工程师标准>>> 假如有个直播间,在数据有更新的时候,能及时反映在客户端上.通信方式来说,有两种: 1.拉取模式. 2.推送+拉取模式(或者纯推 ...

  8. Solr的增量更新和全量更新对比

    Solr的增量更新和全量更新 solr的简介 solr是一个采用java语言,基于Lucene的全文搜索引擎. solr的一些原理 solr通过数据库的数据导入到索引库中,并且给数据创建相应的索引,用 ...

  9. yy部分地区服务器升级维护,3月5日全区全服更新公告 - YY大皇帝 YY大皇帝独家官网 YY大皇帝新手卡...

    亲爱的各位玩家: 羊年开工第一周,我们又继续回来为大家带来最新的游戏内容啦!在3月5日0点,我们将会对全区全服进行一次更新维护,希望各位玩家能喜欢我们奉上的新内容,也衷心希望大家继续给<大皇帝& ...

最新文章

  1. leach协议matlab仿真代码
  2. iOS多设备分辨率适配
  3. 基于JAVA的在线图书销售系统
  4. [交互设计工具/原型创作工具]Axure RP Pro 5.0新特性 破解版 注册码
  5. 阶段3 3.SpringMVC·_04.SpringMVC返回值类型及响应数据类型_4 响应之返回值是ModelAndView类型...
  6. PHP报错 Module ‘openssl‘ already loaded in Unknown on line 0
  7. C语言 扫雷游戏(代码+注释)
  8. 3.9MB超小超强文本识别模型,支持20000个字符的识别,平安产险提出Hamming OCR
  9. 训练神经网络的详细步骤,神经网络训练完怎么用
  10. Python-Selenium自动化登陆QQ空间
  11. C/S - Exploits 学习笔记
  12. 使用易路代理yiluproxy时,出现不是自己选定的城市该怎么办?
  13. 08 网上爬取的数据如何制作成表
  14. Gradle build.gradle配置
  15. ubuntu系统(二):ibus拼音将繁体中文改为简体中文
  16. ARM服务器再添生力军,超云发布两款ARM服务器
  17. 贝宁ECTN/BESC认证相关规定
  18. 乐视三合一体感摄像头标定全过程
  19. UCOSII软件定时器
  20. uniapp轮播组件之自动轮播

热门文章

  1. MySQL基础 - 表达式和函数
  2. qgis 将县区的数据转成市区的边界数据
  3. 29日全国铁路预计发送旅客978万人次 同比增长4%
  4. 设备驱动模型:device, bus, driver之间的联系
  5. m基于simulink的六自由度高超声速飞行器内外环飞行控制器设计与仿真实现
  6. 室内空气流动原理图_室内空气对流是什么原理,知道的人可以过来说说看吗
  7. 在Viz 3.x中如何导入Viz 2.8的打包文件.eva
  8. strlen 头文件 linux,linux下编c语言头文件的问题
  9. Ubuntu开机自动挂载硬盘
  10. 《人工智能训练师》国家职业技能标准发布,看看你是几级调参侠?