node webkit(nw.js) 设置自动更新
原理:把更新的文件放在服务器上,设置一个客户端版本号,每次打开客户端的时候,通过接口获取服务器上的版本,如果高于本地的版本就下载服务器上的代码,低于或等于就不更新
<script>
var http = require('http');
var fs = require('fs');
var request = require('request');
var unzip = require('unzip2');
var Driver = function () {
this.timer = '';
this.timer2 = '';
};
Driver.prototype = {
/* 读取本地版本 */
readFile: function () {
var self = this;
if (fs.existsSync('src/js/global.js')) {
self.case1();
} else {
$.ajax({
type: 'post',
url: 'url(接口地址)',
dataType: 'jsonp',
contentType: "application/jsonp; charset=utf-8",
data: {'userId': 0,
},
success: function (data) {
console.log("正在下载解压包...");
if (data.code == 0) {
if (data.result.update == 1) {
var gx = document.getElementsByClassName('gx')[0];
gx.style.display = "block";
/* 下载地址 下载到的目录*/
if (fs.existsSync('nsrc') || fs.existsSync('upload/zip')) {
self.rmdirFile('upload/zip', function () { self.rmdirFile('nsrc', function () { self.createDir('upload/zip', function () {
console.log("创建下载zip目录成功...");
//创建下载zip的目录
self.downFile(data.result.url);
});
})
})
} else {
self.createDir('upload/zip', function () {
console.log("创建下载zip目录成功...");
//创建下载zip的目录
self.downFile(data.result.url);
});
}
} else {
setTimeout(function () {
window.location.href = "../src/Login/login.html";
}, 2250);
}
}
},
error: function () { alert(data.msg); } }); }
},
/* 如果global没有被删除*/
case1: function () {
var self = this;
global.post('/system/checkVersion', {}, function (data) {
console.log("正在下载解压包...");
if (data.code == 0) {
if (data.result.update == 1) {
var gx = document.getElementsByClassName('gx')[0];
gx.style.display = "block";
/* 下载地址 下载到的目录*/
if (fs.existsSync('nsrc') || fs.existsSync('upload/zip')) {
self.rmdirFile('upload/zip', function () { self.rmdirFile('nsrc', function () { self.createDir('upload/zip', function () {
console.log("创建下载zip目录成功...");
//创建下载zip的目录
self.downFile(data.result.url);
});
})
})
} else {
self.createDir('upload/zip', function () {
console.log("创建下载zip目录成功...");
//创建下载zip的目录
self.downFile(data.result.url);
});
}
} else {
setTimeout(function () {
window.location.href = "../src/Login/login.html";
}, 2250);
}
} else {
alert(data.msg);
}
});
},
/* 下载解压包 */
downFile: function (url) {
var self = this;
self.download(url, 'upload/zip/nsrc.zip', function () {
/* 下载完成创建解压目录 */
clearInterval(self.timer);
sc.style.width = 0;
sj.innerHTML = '正在解压安装 2/2 '
console.log('正在创建临时目录');
self.createDir('nsrc', function () {
self.unZip();
console.log('正在解压...');
/* 前端做的假进程 */
setTimeout(function () {
var startC = parseInt(Math.floor(Math.random() * 3 + 1) * 10);
sc.style.width = startC + '%';
self.timer2 = setInterval(function () {
startC += startC + Math.floor(Math.random() * 3 + 1) * 0.2;
console.log('aaa');
if (startC >= 90) {
clearInterval(self.timer2);
startC = 90;
}
sc.style.width = startC + '%';
}, 500);
}, 1000); });
/*self.unZip();*/
});
},
/* 下载完成创建交换目录 */
createDir: function (v, callback) {
var slef = this;
/* 创建的新目录名是nsrc*/
fs.mkdir(v, function (err) {
if (!err) {
console.log('创建目录成功...');
callback && callback(err);
} else {
console.log("创建目录失败...");
}
})
},
/* 解压zip */
unZip: function () {
var self = this;
/* 解压到nsrc中*/
var extract = unzip.Extract({
path: 'nsrc' //process.cwd()
}); //获取根目录
fs.createReadStream('upload/zip/nsrc.zip').pipe(extract);
extract.on('error', function (err) {
console.log(err); console.log("解压失败");
});
extract.on('finish', function () {
/* argv[1] 主模板的绝对路径 第一个命令行从 argv[2]这个位置开始 */
/* 在此之前删除之前的src文件夹 */
/* self.rmdirFile(process.cwd()+'\\'+'src', function () {
console.log(1);
/* 重命名文件夹 */
/*self.reName(fs.readdirSync(process.cwd()+'\\'+'nsrc')[0]);*/ /*console.log('success')
});*/ }); extract.on('close', function () {
/* */
console.log("解压成功");
self.rmdirFile('src', function () {
/*删除掉之前的src文件夹 解压 重命名新的文件夹*/
self.copy();
}) });
extract.on('end', function () {});
},
copy: function () {
var self = this;
fs.rename('nsrc/src', 'src', function (err) {
/* 删除 nsrc 如果能删除 说明压缩的 还未压缩完 再次压缩*/
if (fs.existsSync('nsrc')) {
fs.rmdir('nsrc', function (err) {
if (err) {
console.log(err);
console.log("删除失败....");
} else {
console.log("删除成功...");
self.copy();
}
});
} else {
self.rmdirFile('upload/zip', function () {
console.log("删除缓存成功...");
console.log("更新完成启动客户端...");
sc.style.width = 100 + '%';
setTimeout(function () {
window.location.href = "../src/Login/login.html";
}, 2250);
});
} })
},
/* 重命名 */
reName: function (filename) {
var self = this;
/* 在此之前删除之前的src文件夹 */
fs.rename('nsrc', 'src', function (err) {
if (err) {
console.log("重命名失败...");
} else {
console.log("重命名成功...");
self.rmdirFile('upload/zip', function () {
console.log("删除缓存成功...");
console.log("更新完成启动客户端...");
});
}
});
},
/* 删除文件夹 */
rmdirFile: function (paths, callback) {
var self = this;
var files = [];
/* 判断目录存在 */
/* d递归遍历*/
if (fs.existsSync(paths)) {
files = fs.readdirSync(paths); //同步请求
files.forEach(function (files, index) {
var curPath = paths + "/" + files; //遍历出每个一个目录
//如果当前目录也是目录
if (fs.statSync(curPath).isDirectory()) { //recurse
/* 递归遍历 */
self.rmdirFile(curPath);
} else {
fs.unlinkSync(curPath); //删除文件
}
});
fs.rmdirSync(paths); //删除空文件夹
console.log("删除成功...");
}
callback && callback(); },
/*---- 下载解压包 ----*/
download: function (uri, filename, callback) {
var self = this;
request.head(uri, function (err, res, body) {
console.log('content-type:', res.headers['content-type']);
console.log('content-length:', res.headers['content-length']);
self.timer = setInterval(function () {
sc.style.width = (fs.statSync(filename).size / res.headers['content-length']) * 100 + '%';
}, 500);
request(uri).pipe(fs.createWriteStream(filename)).on('close', callback);
});
},
},
console.log("执行结束");
</script>
下面,改变我本地的 版本号!此时服务器上版本是1.1.1

打开后客户端:

下载完之后,看下global.js里面的源代码:

版本号发生了改变,此次更新成功!
注:我并非是将所要代码重新打包放到服务器,而是只把自己修改的部分打成zip(代码里可以看到我读取的是zip ),放在服务器上面,里面一定要包含存放版本号的文件,否则无法判断是否该更新!
node webkit(nw.js) 设置自动更新的更多相关文章
- node webkit (nw.js) 无法调试的结局方案之一
之前做过nw项目,当时主要内容是由别人做的!过后回到家中,自己研究了下这方面.结果发现我自己写的nw 客户端不可以调试!在网上各种找办法,没找到,深感绝望,突然看到 (https://github.c ...
- JS时间自动更新
js部分: <!--自动更新时间--><script>function show(){var date = new Date(); //日期对象var now = " ...
- js设置自动刷新
如何实现刷新当前页面呢?借助js你将无所不能. 1,reload 方法,该方法强迫浏览器刷新当前页面.语法:location.reload([bForceGet]) 参数: bForceGet, ...
- phpstorm----------phpstorm设置自动更新的ssh信息如何修改--后续增加如何设置自动更新
1.如何设置phpstorm将本地代码时时同步到远程服务器 注意下面一定要打勾 点击下一步,然后还有一个页面,然后不用做任何操作,直接点击完成.中途有个页面是输入远程服务器ip账号密码链接方式的,那个 ...
- 设置TIMESTAMP和DATETIME的自动初始化及自动更新
最近有一个关于MySQL版本升级的事,涉及到一些关于时间类型的细节问题需要查明,因此到官网找到相关文章,翻出来比较方便自己理解,博客这里也贴一下. 参考官网网址: https://dev.mysql. ...
- [转]Android应用的自动更新
软件的自动更新一般都与Splash界面绑定在一起, 由于需要维护的软件界面很复杂, 一个Activity中嵌入ViewPager, 并且逻辑比较复杂, 索性重新写一个Activity, 现在的软件都很 ...
- 【Android 应用开发】Android应用的自动更新模块
. 作者 :万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/18964835 . 软件的自动更新一般都与Splash界 ...
- 安卓程序代写 网上程序代写[原]Android应用的自动更新模块
软件的自动更新一般都与Splash界面绑定在一起, 由于需要维护的软件界面很复杂, 一个Activity中嵌入ViewPager, 并且逻辑比较复杂, 索性重新写一个Activity, 现在的软件都很 ...
- Android应用的自动更新模块
软件的自动更新一般都与Splash界面绑定在一起, 由于需要维护的软件界面很复杂, 一个Activity中嵌入ViewPager, 并且逻辑比较复杂, 索性重新写一个Activity, 现在的软件都很 ...
随机推荐
- PL/SQL12中文版
PLSQL12,界面优化很不错,更加美观,直接集成中文语言!,更加艳丽 01.界面 02.注册码 注意:有能力的还是购买付费版的,付费是对软件的高度认可和支持 12.0.3.1821 64bit: 注 ...
- Android 蓝牙通信——AndroidBluetoothManager
转载请说明出处! 作者:kqw攻城狮 出处:个人站 | CSDN To get a Git project into your build: Step 1. Add the JitPack repos ...
- 数据库行列转换sql
经常折腾数据库,常常遇到数据库行列转换的问题,下面就用一个小例子来演示下如何进行行列转换. 1.创建一张表 CREATE TABLE [android_source]( [CREATETIME] [d ...
- 采集并分析Nginx访问日志
日志服务支持通过数据接入向导配置采集Nginx日志,并自动创建索引和Nginx日志仪表盘,帮助您快速采集并分析Nginx日志. 许多个人站长选取了Nginx作为服务器搭建网站,在对网站访问情况进行分析 ...
- HDUOJ-----A == B ?
A == B ? Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...
- SaltStack 入门到精通第二篇:Salt-master配置文件详解
SaltStack 入门到精通第二篇:Salt-master配置文件详解 转自(coocla):http://blog.coocla.org/301.html 原本想要重新翻译salt-mas ...
- HDU 2492 Ping pong (数状数组)
Ping pong Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- [Aaronyang] 写给自己的WPF4.5 笔记5[数据绑定三巴掌1/3]
生活总有意外,微笑对待每一件事,无需抱怨--Aaronyang的博客(www.ayjs.net) 博文摘要:数据库下载 教你如何在vs2013中不安装Mssql数据库,使用了Sqlserver Com ...
- Android的 EditText的inputType类型
android开发过程中突然发现的warning EditText 报出 “This text field does not specify an inputType or a hint” 原因: ...
- Smarty标签 for运算
$select="SELECT {$col_name} FROM woke_order where deleted=0 ".$where.$orderby ; // 取出数组 $r ...