最近在開發基於 nw.js 的桌面應用,需求中須要實現軟件的熱更新,下面簡單說下實現步驟html
node-webkit 至關於 Chromium 和 node.js 的結合體,咱們能夠經過它來將web應用打包成跨平臺的桌面應用,使桌面應用的開發更加簡單、高效node
由 nw 官方開發者提供的 應用熱更新組件linux
npm install node-webkit-updater
git
修改開發目錄下的 package.json
,設置版本檢查的信息和新版本下載地址github
{ "name": "應用名", "version": "0.0.1", //版本號 "manifestUrl": "xxx/package.json", //應用須要校驗的配置文件地址 "packages": { //新版本壓縮包下載地址 "mac": { "url": "xxx/updapp.zip" }, "win": { "url": "xxx/updapp.zip" }, "linux32": { "url": "xxx/updapp.tar.gz" } } }
在項目的 js 中使用 node-webkit-updater
進行版本校驗web
var gui = require('nw.gui'); //操做nw應用 var pkg = require('./package.json'); // 本地配置文件 var updater = require('node-webkit-updater'); //熱更新 var upd = new updater(pkg); var copyPath, execPath; var progressTimer; //設置一個定時器,用來模擬下載的進去條 if (gui.App.argv.length) { copyPath = gui.App.argv[0]; execPath = gui.App.argv[1]; // 替換舊版本 upd.install(copyPath, function(err) { if (!err) { // 重啓 upd.run(execPath, null); gui.App.quit(); } }); } else { // 從manifest目錄校驗版本 upd.checkNewVersion(function(error, newVersionExists, manifest) { if (!error && newVersionExists) { // 有新版本顯示下載進度條開始下載 $('.mask').show(); setTimeout(function() { var startC = parseInt(Math.floor(Math.random() + 1) * 3); $('.progress div').width(startC + '%'); progressTimer = setInterval(function() { startC += Math.random() * 2; if (startC >= 95) { clearInterval(progressTimer); startC = 95; } $('.progress div').width(startC + '%'); $('.progress p').html(startC.toFixed(2) + '%'); }, 2000); }, 1000); // 下載新版本 upd.download(function(error, filename) { if (!error) { clearInterval(progressTimer); $('.progress div').width('100%'); $('.progress p').html('100%'); // 下載完成關閉應用 upd.unpack(filename, function(error, newAppPath) { if (!error) { // 重啓應用 upd.runInstaller(newAppPath, [upd.getAppPath(), upd.getAppExec()], {}); gui.App.quit(); } }, manifest); } }, manifest); } }); }
當有新版本更新後把新版本打成壓縮包放到配置文件中配置的目錄,npm
並把新的package.json也放到配置的目錄下json
這樣用戶在打開應用的時候就會去校驗版本,若是有新版本就會去自動下載了,而且在下載完成後應用會自動重啓app