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, 现在的软件都很 ...
随机推荐
- <c:url>标签相关知识点
<c:url>标签: value:指定路径!他会在路径前面自动添加项目名. <c:url value="/index.jsp"/>,他会输出/day14/i ...
- PHP 调用ffmpeg
PHP 调用ffmpeg linux ffmpeg安装,tar文件安装一直出错,一直无语 php-ffmpeg安装, tar文件安装也一直出错,一直无语 最后直接在系统上安装ffmpeg sudo a ...
- Utils--封装好的下载图片的方法
/** * 封装下载图片方法 * @param url 下载地址 * @param filename * @return 下载成功为true */ public boolean downfile(St ...
- 阿里员工都是这样排查Java问题的,附工具单(转)
平时的工作中经常碰到很多疑难问题的处理,在解决问题的同时,有一些工具起到了相当大的作用,在此书写下来,一是作为笔记,可以让自己后续忘记了可快速翻阅,二是分享,希望看到此文的同学们可以拿出自己日常觉得帮 ...
- Java容器集合类的区别用法
Set,List,Map,Vector,ArrayList的区别 JAVA的容器---List,Map,Set Collection ├List │├LinkedList │├ArrayList │└ ...
- clear session on close of browser jsp
关闭浏览器销毁session <%@ Page Language="C#" AutoEventWireup="true" CodeBehind=" ...
- tf.gfile
一.功能和目的 tf.gfile模块定义在tensorflow/python/platform/gfile.py,但其源代码实现主要位于tensorflow/tensorflow/python/lib ...
- linux shell 脚本攻略学习9--rename命令详解
rename命令详解: 对文件重命名是常用的操作之一,一般对单个文件的重命名用mv命令,如: amosli@amosli-pc:~/learn/example$ ls abc.txt amosli@a ...
- iOS block分析
block是代码块,其本质和变量类似.不同的是代码块存储的数据是一个函数体.使用Block,就可以像其他标准函数一样,传入参数,并得到返回值. 可以把Block当做Objective-C的匿名函数,B ...
- 树莓派进阶之路 (021) - 3.2inch RPi LCD (B)
参考文档:http://www.waveshare.net/wiki/3.2inch_RPi_LCD_(B) 产品特点 320x240分辨率 电阻式触摸控制 兼容并可直接插入任何版本树莓派 提供Ras ...