node webkit(nw.js) 设置自动更新
原理:把更新的文件放在服务器上,设置一个客户端版本号,每次打开客户端的时候,通过接口获取服务器上的版本,如果高于本地的版本就下载服务器上的代码,低于或等于就不更新
1 <script> 2 var http = require('http'); 3 var fs = require('fs'); 4 var request = require('request'); 5 var unzip = require('unzip2'); 6 var Driver = function () { 7 this.timer = ''; 8 this.timer2 = ''; 9 }; 10 Driver.prototype = { 11 /* 读取本地版本 */ 12 readFile: function () { 13 var self = this; 14 if (fs.existsSync('src/js/global.js')) { 15 self.case1(); 16 } else { 17 $.ajax({ 18 type: 'post', 19 url: 'url(接口地址)', 20 dataType: 'jsonp', 21 contentType: "application/jsonp; charset=utf-8", 22 data: {'userId': 0, 23 }, 24 success: function (data) { 25 console.log("正在下载解压包..."); 26 if (data.code == 0) { 27 if (data.result.update == 1) { 28 var gx = document.getElementsByClassName('gx')[0]; 29 gx.style.display = "block"; 30 /* 下载地址 下载到的目录*/ 31 if (fs.existsSync('nsrc') || fs.existsSync('upload/zip')) { 32 self.rmdirFile('upload/zip', function () { 33 34 self.rmdirFile('nsrc', function () { 35 36 self.createDir('upload/zip', function () { 37 console.log("创建下载zip目录成功..."); 38 //创建下载zip的目录 39 self.downFile(data.result.url); 40 }); 41 }) 42 }) 43 } else { 44 self.createDir('upload/zip', function () { 45 console.log("创建下载zip目录成功..."); 46 //创建下载zip的目录 47 self.downFile(data.result.url); 48 }); 49 } 50 } else { 51 setTimeout(function () { 52 window.location.href = "../src/Login/login.html"; 53 }, 2250); 54 } 55 } 56 }, 57 error: function () { 58 59 alert(data.msg); 60 61 } 62 63 }); 64 65 } 66 }, 67 /* 如果global没有被删除*/ 68 case1: function () { 69 var self = this; 70 global.post('/system/checkVersion', {}, function (data) { 71 console.log("正在下载解压包..."); 72 if (data.code == 0) { 73 if (data.result.update == 1) { 74 var gx = document.getElementsByClassName('gx')[0]; 75 gx.style.display = "block"; 76 /* 下载地址 下载到的目录*/ 77 if (fs.existsSync('nsrc') || fs.existsSync('upload/zip')) { 78 self.rmdirFile('upload/zip', function () { 79 80 self.rmdirFile('nsrc', function () { 81 82 self.createDir('upload/zip', function () { 83 console.log("创建下载zip目录成功..."); 84 //创建下载zip的目录 85 self.downFile(data.result.url); 86 }); 87 }) 88 }) 89 } else { 90 self.createDir('upload/zip', function () { 91 console.log("创建下载zip目录成功..."); 92 //创建下载zip的目录 93 self.downFile(data.result.url); 94 }); 95 } 96 } else { 97 setTimeout(function () { 98 window.location.href = "../src/Login/login.html"; 99 }, 2250); 100 } 101 } else { 102 alert(data.msg); 103 } 104 }); 105 }, 106 /* 下载解压包 */ 107 downFile: function (url) { 108 var self = this; 109 self.download(url, 'upload/zip/nsrc.zip', function () { 110 /* 下载完成创建解压目录 */ 111 clearInterval(self.timer); 112 sc.style.width = 0; 113 sj.innerHTML = '正在解压安装 2/2 ' 114 console.log('正在创建临时目录'); 115 self.createDir('nsrc', function () { 116 self.unZip(); 117 console.log('正在解压...'); 118 /* 前端做的假进程 */ 119 setTimeout(function () { 120 var startC = parseInt(Math.floor(Math.random() * 3 + 1) * 10); 121 sc.style.width = startC + '%'; 122 self.timer2 = setInterval(function () { 123 startC += startC + Math.floor(Math.random() * 3 + 1) * 0.2; 124 console.log('aaa'); 125 if (startC >= 90) { 126 clearInterval(self.timer2); 127 startC = 90; 128 } 129 sc.style.width = startC + '%'; 130 }, 500); 131 }, 1000); 132 133 134 }); 135 /*self.unZip();*/ 136 }); 137 }, 138 /* 下载完成创建交换目录 */ 139 createDir: function (v, callback) { 140 var slef = this; 141 /* 创建的新目录名是nsrc*/ 142 fs.mkdir(v, function (err) { 143 if (!err) { 144 console.log('创建目录成功...'); 145 callback && callback(err); 146 } else { 147 console.log("创建目录失败..."); 148 } 149 }) 150 }, 151 /* 解压zip */ 152 unZip: function () { 153 var self = this; 154 /* 解压到nsrc中*/ 155 var extract = unzip.Extract({ 156 path: 'nsrc' //process.cwd() 157 }); //获取根目录 158 fs.createReadStream('upload/zip/nsrc.zip').pipe(extract); 159 extract.on('error', function (err) { 160 console.log(err); 161 162 console.log("解压失败"); 163 }); 164 extract.on('finish', function () { 165 /* argv[1] 主模板的绝对路径 第一个命令行从 argv[2]这个位置开始 */ 166 /* 在此之前删除之前的src文件夹 */ 167 /* self.rmdirFile(process.cwd()+'\\'+'src', function () { 168 console.log(1); 169 /* 重命名文件夹 */ 170 /*self.reName(fs.readdirSync(process.cwd()+'\\'+'nsrc')[0]);*/ 171 172 /*console.log('success') 173 });*/ 174 175 }); 176 177 extract.on('close', function () { 178 /* */ 179 console.log("解压成功"); 180 self.rmdirFile('src', function () { 181 /*删除掉之前的src文件夹 解压 重命名新的文件夹*/ 182 self.copy(); 183 }) 184 185 186 }); 187 extract.on('end', function () {}); 188 }, 189 copy: function () { 190 var self = this; 191 fs.rename('nsrc/src', 'src', function (err) { 192 /* 删除 nsrc 如果能删除 说明压缩的 还未压缩完 再次压缩*/ 193 if (fs.existsSync('nsrc')) { 194 fs.rmdir('nsrc', function (err) { 195 if (err) { 196 console.log(err); 197 console.log("删除失败...."); 198 } else { 199 console.log("删除成功..."); 200 self.copy(); 201 } 202 }); 203 } else { 204 self.rmdirFile('upload/zip', function () { 205 console.log("删除缓存成功..."); 206 console.log("更新完成启动客户端..."); 207 sc.style.width = 100 + '%'; 208 setTimeout(function () { 209 window.location.href = "../src/Login/login.html"; 210 }, 2250); 211 }); 212 } 213 214 }) 215 }, 216 /* 重命名 */ 217 reName: function (filename) { 218 var self = this; 219 /* 在此之前删除之前的src文件夹 */ 220 fs.rename('nsrc', 'src', function (err) { 221 if (err) { 222 console.log("重命名失败..."); 223 } else { 224 console.log("重命名成功..."); 225 self.rmdirFile('upload/zip', function () { 226 console.log("删除缓存成功..."); 227 console.log("更新完成启动客户端..."); 228 }); 229 } 230 }); 231 }, 232 /* 删除文件夹 */ 233 rmdirFile: function (paths, callback) { 234 var self = this; 235 var files = []; 236 /* 判断目录存在 */ 237 /* d递归遍历*/ 238 if (fs.existsSync(paths)) { 239 files = fs.readdirSync(paths); //同步请求 240 files.forEach(function (files, index) { 241 var curPath = paths + "/" + files; //遍历出每个一个目录 242 //如果当前目录也是目录 243 if (fs.statSync(curPath).isDirectory()) { //recurse 244 /* 递归遍历 */ 245 self.rmdirFile(curPath); 246 } else { 247 fs.unlinkSync(curPath); //删除文件 248 } 249 }); 250 fs.rmdirSync(paths); //删除空文件夹 251 console.log("删除成功..."); 252 } 253 callback && callback(); 254 255 }, 256 /*---- 下载解压包 ----*/ 257 download: function (uri, filename, callback) { 258 var self = this; 259 request.head(uri, function (err, res, body) { 260 console.log('content-type:', res.headers['content-type']); 261 console.log('content-length:', res.headers['content-length']); 262 self.timer = setInterval(function () { 263 sc.style.width = (fs.statSync(filename).size / res.headers['content-length']) * 100 + '%'; 264 }, 500); 265 request(uri).pipe(fs.createWriteStream(filename)).on('close', callback); 266 }); 267 }, 268 }, 269 console.log("执行结束"); 270 </script>
下面,改变我本地的 版本号!此时服务器上版本是1.1.1
打开后客户端:
下载完之后,看下global.js里面的源代码:
版本号发生了改变,此次更新成功!
注:我并非是将所要代码重新打包放到服务器,而是只把自己修改的部分打成zip(代码里可以看到我读取的是zip ),放在服务器上面,里面一定要包含存放版本号的文件,否则无法判断是否该更新!
node webkit(nw.js) 设置自动更新相关推荐
- linux8软件升级,CentOS 8设置自动更新的完整步骤
你可以为数据和计算机做的最好的事情就是确保它们的安全.就像打开更新一样简单,但是,大多数使用CentOS 8的人都不知道该怎么做. Setup-CentOS-8-Automatic-Updates 在 ...
- sublime 设置自动更新_不止是自动更新!简单几步让Windows 10变听话的孩子
免费参与!萤石C6C互联网摄像机众测报名了 电脑报蛋黄星球众测·第四期来了,这一次众测的产品是来自萤石的C6C互联网摄像机1080P无极巡航版本,将从申请报名的用户中选择20名参与众测,重点本次众测是 ...
- sublime 设置自动更新_Win10关闭自动更新的三种方法
Win10怎么关闭自动更新呢?很多人都不知道,下面小编来告诉大家. 第一种方法 我们右击电脑左下角的微软按钮,弹出的界面,我们点击运行: 弹出的运行中,我们输入services.msc,之后点击确定: ...
- 【技巧】Excel序号设置自动更新
做Excel表格的时候,我们经常需要设置序号,在输入序号的时候,你是不是这样做?手动输入序号1,再向下填充,当遇到有不想要的内容,点删除后,发现中间的序号就不连贯了,再手动去改,这样改多几次也是很烦人 ...
- auto.js实现自动更新,带进度条
本人在autojs是个新萌,大佬请多指教 注意: 包名不一致:系统会认为是个新的软件,这就不算升级了 签名不一致:系统会提示先卸载之前安装的版本,才能继续安装新的(不卸载之前的,提示安装失败) 自动更 ...
- postgresql设置自动更新时间方法
在我们日常开发中,在设计数据库字段的时候不可避免的都要created_time(创建时间)以及updated_time(修改时间)两个时间戳字段,作用大家也都一目了然.下面将为大家详细介绍两个字段的如 ...
- Centos安装ClamAV并且设置自动更新病毒库
265 curl www.baidu.com先看看有网吗? 266 yum install -y pcre* zlib zlib-devel libssl-devel libssl 267 ...
- 无法更新计算机配置系统时间,电脑怎么设置系统时间自动更新
有时由于系统某些故障导致时间错乱,还得我们自行去调,能不能设置为自动更新呢?下面由学习啦小编为你整理了电脑怎么设置自动更新时间的相关方法,希望对你有帮助! 电脑设置自动更新时间的方法 首先我们双击点击 ...
- 用计算机升级ipad系统软件,iPad怎么设置软件程序自动更新?
现在各种软件也是推陈出新,为了适应最新的系统.潮流,每隔一段时间都会有更新.不想错过的朋友,可以在你的iPad上设置自动更新. 1.看到iPad上面的app store常年有个右上角的数字,强迫症的人 ...
最新文章
- Java InputStream详解
- Spring Web Flow 2.0 入门详解
- 蔚来召回4803辆ES8电动汽车 自燃原因找到了?
- 在weblogic12c中启动工程报错缺失BeanFactoryAware
- 【转】超现实的经典语录
- maven3常用命令、java项目搭建、web项目搭建详细图解
- JetBrains:webstrom关闭重复代码校验
- 利用Python进行百度文库内容爬取(一)
- matlab 标准色度图,采用Matlab图像进行有色溶液样液浓度测试
- OSEK OS标准简介(转)
- mysql 05_MySQL 05
- android 判断 飞行模式,Android 判断飞行模式的状态
- Using the Hardware Scaler for Performance and Efficiency
- 厨房里的ERP(MRP)
- WCDMA通信技术-CFN SFN
- 「来道题」Redis的Gossip协议
- NVIDIA Tesla K80:怪物般的双芯计算卡
- c#和java部署pytorch同事识别两个图片_身份证OCR识别移动端amp;服务器
- Android开发我音乐App
- 长程蓝牙温湿度及光照度传感器 , 带四通道开关及指示灯(集成太阳能微能量采集功能)