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, 现在的软件都很 ...
随机推荐
- 备忘DES简单加密与解密
package com.ego.util; import java.io.IOException; import java.security.SecureRandom; import javax.cr ...
- Debian使用相关
1)将普通用户添加到sudo组 首先安装sudo: root@~#: apt-get install sudo 然后添加将wzc用户添加到sudo组: root@~#: usermod -a -G s ...
- Thinkpad X240使用U盘安装Win7系统
更改BIOS设置 不同电脑的进入BIOS的方式可能不太一样,Thinkpad X240的进入方式是在电脑启动的时候按下回车键,然后按F1进入BIOS. 1. 修改secure boot为Disable ...
- Maximum Subarray(最大子数组)
Find the contiguous subarray within an array (containing at least one number) which has the largest ...
- linux 下camera调试笔记【转】
转自:https://blog.csdn.net/kevinx_xu/article/details/8801931 linux camera调试 2011-10-23 10:43:37| 分类: ...
- Playrix Codescapes Cup (Codeforces Round #413, rated, Div. 1 + Div. 2) E - Aquarium decoration 贪心 + 平衡树
E - Aquarium decoration 枚举两个人都喜欢的个数,就能得到单个喜欢的个数,然后用平衡树维护前k大的和. #include<bits/stdc++.h> #define ...
- 使用plugins让打包更便捷
之前运行dist下的js,都是手动把index.html拷贝过去的,每次把dist文件夹删除,都需要将index.html拷贝进去,这样很麻烦,我们在webpack官方插件中找到HtmlWebpack ...
- delphi弹出选择对话框选择目录|SelectDirectory 函数(转)
SelectDirectory 函数 通过显示一个对话框来让用户选择一个目录.注意:在使用前要在Uses 语句中添加包含FileCtrl 的说明.函数原型如下:function SelectDirec ...
- 使用Ext 创建树
ext使用的是ext3.4.0版本 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> < ...
- java多线程 synchronized关键字的一些用法
看这篇文章啦: http://blog.csdn.net/xiao__gui/article/details/8188833