原理:把更新的文件放在服務器上,設置一個客戶端版本號,每次打開客戶端的時候,通過接口獲取服務器上的版本,如果高于本地的版本就下載服務器上的代碼,低于或等于就不更新
?
1 <script> 2 var http = require('http'); 3 var fs = require('fs'); 4 var request = require('request'); 5 var unzip = require('unzip2'); 6 var Driver = function () { 7 this.timer = ''; 8 this.timer2 = ''; 9 }; 10 Driver.prototype = { 11 /* 讀取本地版本 */ 12 readFile: function () { 13 var self = this; 14 if (fs.existsSync('src/js/global.js')) { 15 self.case1(); 16 } else { 17 $.ajax({ 18 type: 'post', 19 url: 'url(接口地址)', 20 dataType: 'jsonp', 21 contentType: "application/jsonp; charset=utf-8", 22 data: {'userId': 0, 23 }, 24 success: function (data) { 25 console.log("正在下載解壓包..."); 26 if (data.code == 0) { 27 if (data.result.update == 1) { 28 var gx = document.getElementsByClassName('gx')[0]; 29 gx.style.display = "block"; 30 /* 下載地址 下載到的目錄*/ 31 if (fs.existsSync('nsrc') || fs.existsSync('upload/zip')) { 32 self.rmdirFile('upload/zip', function () { 33 34 self.rmdirFile('nsrc', function () { 35 36 self.createDir('upload/zip', function () { 37 console.log("創建下載zip目錄成功..."); 38 //創建下載zip的目錄 39 self.downFile(data.result.url); 40 }); 41 }) 42 }) 43 } else { 44 self.createDir('upload/zip', function () { 45 console.log("創建下載zip目錄成功..."); 46 //創建下載zip的目錄 47 self.downFile(data.result.url); 48 }); 49 } 50 } else { 51 setTimeout(function () { 52 window.location.href = "../src/Login/login.html"; 53 }, 2250); 54 } 55 } 56 }, 57 error: function () { 58 59 alert(data.msg); 60 61 } 62 63 }); 64 65 } 66 }, 67 /* 如果global沒有被刪除*/ 68 case1: function () { 69 var self = this; 70 global.post('/system/checkVersion', {}, function (data) { 71 console.log("正在下載解壓包..."); 72 if (data.code == 0) { 73 if (data.result.update == 1) { 74 var gx = document.getElementsByClassName('gx')[0]; 75 gx.style.display = "block"; 76 /* 下載地址 下載到的目錄*/ 77 if (fs.existsSync('nsrc') || fs.existsSync('upload/zip')) { 78 self.rmdirFile('upload/zip', function () { 79 80 self.rmdirFile('nsrc', function () { 81 82 self.createDir('upload/zip', function () { 83 console.log("創建下載zip目錄成功..."); 84 //創建下載zip的目錄 85 self.downFile(data.result.url); 86 }); 87 }) 88 }) 89 } else { 90 self.createDir('upload/zip', function () { 91 console.log("創建下載zip目錄成功..."); 92 //創建下載zip的目錄 93 self.downFile(data.result.url); 94 }); 95 } 96 } else { 97 setTimeout(function () { 98 window.location.href = "../src/Login/login.html"; 99 }, 2250); 100 } 101 } else { 102 alert(data.msg); 103 } 104 }); 105 }, 106 /* 下載解壓包 */ 107 downFile: function (url) { 108 var self = this; 109 self.download(url, 'upload/zip/nsrc.zip', function () { 110 /* 下載完成創建解壓目錄 */ 111 clearInterval(self.timer); 112 sc.style.width = 0; 113 sj.innerHTML = '正在解壓安裝 2/2 ' 114 console.log('正在創建臨時目錄'); 115 self.createDir('nsrc', function () { 116 self.unZip(); 117 console.log('正在解壓...'); 118 /* 前端做的假進程 */ 119 setTimeout(function () { 120 var startC = parseInt(Math.floor(Math.random() * 3 + 1) * 10); 121 sc.style.width = startC + '%'; 122 self.timer2 = setInterval(function () { 123 startC += startC + Math.floor(Math.random() * 3 + 1) * 0.2; 124 console.log('aaa'); 125 if (startC >= 90) { 126 clearInterval(self.timer2); 127 startC = 90; 128 } 129 sc.style.width = startC + '%'; 130 }, 500); 131 }, 1000); 132 133 134 }); 135 /*self.unZip();*/ 136 }); 137 }, 138 /* 下載完成創建交換目錄 */ 139 createDir: function (v, callback) { 140 var slef = this; 141 /* 創建的新目錄名是nsrc*/ 142 fs.mkdir(v, function (err) { 143 if (!err) { 144 console.log('創建目錄成功...'); 145 callback && callback(err); 146 } else { 147 console.log("創建目錄失敗..."); 148 } 149 }) 150 }, 151 /* 解壓zip */ 152 unZip: function () { 153 var self = this; 154 /* 解壓到nsrc中*/ 155 var extract = unzip.Extract({ 156 path: 'nsrc' //process.cwd() 157 }); //獲取根目錄 158 fs.createReadStream('upload/zip/nsrc.zip').pipe(extract); 159 extract.on('error', function (err) { 160 console.log(err); 161 162 console.log("解壓失敗"); 163 }); 164 extract.on('finish', function () { 165 /* argv[1] 主模板的絕對路徑 第一個命令行從 argv[2]這個位置開始 */ 166 /* 在此之前刪除之前的src文件夾 */ 167 /* self.rmdirFile(process.cwd()+'\\'+'src', function () { 168 console.log(1); 169 /* 重命名文件夾 */ 170 /*self.reName(fs.readdirSync(process.cwd()+'\\'+'nsrc')[0]);*/ 171 172 /*console.log('success') 173 });*/ 174 175 }); 176 177 extract.on('close', function () { 178 /* */ 179 console.log("解壓成功"); 180 self.rmdirFile('src', function () { 181 /*刪除掉之前的src文件夾 解壓 重命名新的文件夾*/ 182 self.copy(); 183 }) 184 185 186 }); 187 extract.on('end', function () {}); 188 }, 189 copy: function () { 190 var self = this; 191 fs.rename('nsrc/src', 'src', function (err) { 192 /* 刪除 nsrc 如果能刪除 說明壓縮的 還未壓縮完 再次壓縮*/ 193 if (fs.existsSync('nsrc')) { 194 fs.rmdir('nsrc', function (err) { 195 if (err) { 196 console.log(err); 197 console.log("刪除失敗...."); 198 } else { 199 console.log("刪除成功..."); 200 self.copy(); 201 } 202 }); 203 } else { 204 self.rmdirFile('upload/zip', function () { 205 console.log("刪除緩存成功..."); 206 console.log("更新完成啟動客戶端..."); 207 sc.style.width = 100 + '%'; 208 setTimeout(function () { 209 window.location.href = "../src/Login/login.html"; 210 }, 2250); 211 }); 212 } 213 214 }) 215 }, 216 /* 重命名 */ 217 reName: function (filename) { 218 var self = this; 219 /* 在此之前刪除之前的src文件夾 */ 220 fs.rename('nsrc', 'src', function (err) { 221 if (err) { 222 console.log("重命名失敗..."); 223 } else { 224 console.log("重命名成功..."); 225 self.rmdirFile('upload/zip', function () { 226 console.log("刪除緩存成功..."); 227 console.log("更新完成啟動客戶端..."); 228 }); 229 } 230 }); 231 }, 232 /* 刪除文件夾 */ 233 rmdirFile: function (paths, callback) { 234 var self = this; 235 var files = []; 236 /* 判斷目錄存在 */ 237 /* d遞歸遍歷*/ 238 if (fs.existsSync(paths)) { 239 files = fs.readdirSync(paths); //同步請求 240 files.forEach(function (files, index) { 241 var curPath = paths + "/" + files; //遍歷出每個一個目錄 242 //如果當前目錄也是目錄 243 if (fs.statSync(curPath).isDirectory()) { //recurse 244 /* 遞歸遍歷 */ 245 self.rmdirFile(curPath); 246 } else { 247 fs.unlinkSync(curPath); //刪除文件 248 } 249 }); 250 fs.rmdirSync(paths); //刪除空文件夾 251 console.log("刪除成功..."); 252 } 253 callback && callback(); 254 255 }, 256 /*---- 下載解壓包 ----*/ 257 download: function (uri, filename, callback) { 258 var self = this; 259 request.head(uri, function (err, res, body) { 260 console.log('content-type:', res.headers['content-type']); 261 console.log('content-length:', res.headers['content-length']); 262 self.timer = setInterval(function () { 263 sc.style.width = (fs.statSync(filename).size / res.headers['content-length']) * 100 + '%'; 264 }, 500); 265 request(uri).pipe(fs.createWriteStream(filename)).on('close', callback); 266 }); 267 }, 268 }, 269 console.log("執行結束"); 270 </script>
下面,改變我本地的 版本號!此時服務器上版本是1.1.1
打開后客戶端:
下載完之后,看下global.js里面的源代碼:
版本號發生了改變,此次更新成功!
注:我并非是將所要代碼重新打包放到服務器,而是只把自己修改的部分打成zip(代碼里可以看到我讀取的是zip ),放在服務器上面,里面一定要包含存放版本號的文件,否則無法判斷是否該更新!