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