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, 现在的软件都很 ...
随机推荐
- [Nginx]用Nginx实现与应用结合的訪问控制 - 防盗链
应用场景:图片等资源须要设置权限,如:仅仅有认证过的用户才干訪问自己的图片. 解决的方法:使用Nginx的防盗链模块http_secure_link能够实现,该模块默认情况下不包括.故在安装时要加上- ...
- 6、java5线程池之固定大小线程池newFixedThreadPool
JDK文档说明: 创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程.在任意点,在大多数 nThreads 线程会处于处理任务的活动状态.如果在所有线程处于活动状态时提交附加任务,则 ...
- 2011的n次方
题目:http://noi.openjudge.cn/ch0204/2991/ 总时间限制:1000ms 内存限制: 65536kB 描述 已知长度最大为200位的正整数n,请求出2011^n的后四 ...
- 基于 CADisplayLink 的 FPS 指示器详解
前言 之前在开发中有使用到计时器NSTimer,后来了解到iOS中不同的计时方法,其中就包括了CADisplayLink.基于CADisplayLink以屏幕刷新频率同步绘图的特性,尝试根据这点去实现 ...
- SoapUI利用Groovy对response与断言的处理
1.对response的处理:(其中Test Request是request的名称) def groovyUtils = new com.eviware.soapui.support.GroovyUt ...
- Java 图片矢量压缩
直接贴出工具类源码 package com.snow.web.util.publics; import java.awt.Image; import java.awt.image.BufferedIm ...
- elk之elasticsearch 入门
一.概述: 1.查看elasticsearch集群的健康状况: [root@node115 kibana]# curl -X GET http://192.168.39.115:9200/_cat/h ...
- 【javascript】js中的函数节流和函数防抖
一.概念解释 函数节流和函数防抖,两者都是优化高频率执行js代码的一种手段. 大家大概都知道旧款电视机的工作原理,就是一行行得扫描出色彩到屏幕上,然后组成一张张图片.由于肉眼只能分辨出一定频率的变 ...
- 【Hibernate】hibernate框架的搭建
1, Hibernate 是什么 Hibernate是java应用程序与数据库交互的开发的框架. Hibernate是一个开源,轻量级的ORM(对象关系映射)工具. 2,Hibernate框架的优点 ...
- C#多线程JOIN方法初探
[说明:刚接触多线程时,弄不明白Join()的作用,查阅了三本书,都不明不白.后来经过自己的一番试验,终于弄清了Join()的本质.大家看看我这种写法是否易懂,是否真的写出了Join()的本质,多提宝 ...