原理:把更新的文件放在服務器上,設置一個客戶端版本號,每次打開客戶端的時候,通過接口獲取服務器上的版本,如果高於本地的版本就下載服務器上的代碼,低於或等於就不更新
代碼如下:
<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 ),放在服務器上面,里面一定要包含存放版本號的文件,否則無法判斷是否該更新!
注:此程序並非由我寫!是我們公司的人寫的!只是覺得不錯,和大家分享分享!這里感謝東哥!
有寫的不好的地方,還希望大家指教!
