HelloGoogle Node。js一个基于GoogleV8的JavaScript引擎。 一个伟大的端至端语言,或许我对你的热爱源自于web这门极富情感的技术吧! 注: 光阴似水,人生若梦,又是人间年尾。许久未说过如此矫情而生硬的话 如此篇幅实在无法写明白我扭曲的心理,2017望我还能继续迈进! 喜庆的话不多说,今天给大家分享一个大致3周前,初次涉足Node。js实现的nw。js桌面程序的自动更新aclasstaghrefwiki10071IQp896J。html模块a吧。 本文不做教学,仅用于打脸!希望以此得到各位大神的帮助。 我本没有打算写如此博客来误人子弟,这里感谢老毕() 下面说的这个模块是基于angular。js的,如此粗鄙的几行代码,还望各位同仁瞄眼之后便使劲的喷! 一、机制分析 此机制的优劣性暂且不议,这仅是目前我唯一能想到的! 已经说了太多无聊的话,这个机制我就画个简单的草图来呈现吧。 从图中不难看出,我所谓的这个自动更新机制其实仅4步而已: 1。确定本地版本号与远端版本号 2。检测版本与平台 3。判断版本差异性 4。是否存在差异的进一步处理 二、模块实现 1。模块依赖 fsrequire(fs);pathrequire(path);requestrequire(request);childprocessrequire(childprocess); 以下为依赖模块的简要释义: fs:node。js文件系统模块 path:node。js文件路径模块 request:node。jshttp模块 childprocess:node。js子进程模块 2。版本对比(使用文件读写模块对本地版本号的写入与更新) compareVer:function(RequestUrl){varremoteURLRequestUvardeferredq。defer();fs。readFile(path。join(nwDir,version。txt),function(err,data){if(err){fs。writeFile(path。join(nwDir,version。txt),0。0。1,function(err){if(err)});alert(系统检测到重要文件丢失,请手动重启应用!); process。exit(0);}else{version。localVhttp。get(remoteURL)。success(function(items){if(items。code200){version。remoteVeritems。data。varisUpdateversion。localVversion。remoteVversion。localVer!version。remoteVer?true:items。isUpdateisUif(isUpdate){fs。writeFile(path。join(nwDir,version。txt),version。remoteVer,function(err){if(err)});}deferred。resolve(items);}})。error(function(data,status,headers,config){alert(程序初始化失败,请检查网络连接!);});}});returndeferred。}, 3。执行升级(使用http模块对差异版进行下载并执行文件流写入操作) update:function(DownloadUrl,total){request(DownloadUrl,function(error,response){if(!response。statusCode200){angular。element(。title)。html(升级完成);angular。element(span)。html(100);interval。cancel(timer);vart3;varintervalinterval(function(){angular。element(。title)。html(自动重启);angular。element(progress)。html(spanstylefontsize:);if(0){win。hide()childprocess。exec(file,function(err,stdout,stderr){process。exit(0);});interval。cancel(interval);}},1000)}})。pipe(fs。createWriteStream(file));vartimerinterval(function(){varloadedfs。statSync(file)。varpercentCvardownloadProgress(percentComplete100)。toFixed(1);angular。element(span)。html(downloadProgress);},100);} 4。无差异性处理(隐藏主进程并创建子进程) normal:function(){win。hide();childprocess。exec(file,function(err,stdout,stderr){process。exit(0);});}, 三、完整模块代码 nw。js桌面程序自动更新moduleforangularAuthor:BGONLINE20161229(function(angular,factory){if(define。amd){define(bgoupdate,〔angular〕,function(angular){returnfactory(angular);});}else{returnfactory(angular);}}(typeofangularundefined?null:angular,function(angular){varmoduleangular。module(bgoUpdate,〔〕);module。factory(bgoAutoUpdate,〔http,q,interval,timeout,function(http,q,interval,timeout){varversion{localVer:,remoteVer:}varfsrequire(fs);varpathrequire(path);varrequestrequire(request);varchildprocessrequire(childprocess);varnwPathprocess。execPvarnwDirpath。dirname(nwPath);varfilepath。join(nwDir,current。exe);return{normal:function(){varintervalinterval(function(){str。;angular。element(span)。html(str);if(str。3){win。hide()childprocess。exec(file,function(err,stdout,stderr){process。exit(0);interval。cancel(interval);});}},1000)},compareVer:function(RequestUrl){varremoteURLRequestUvardeferredq。defer();fs。readFile(path。join(nwDir,version。txt),function(err,data){if(err){fs。writeFile(path。join(nwDir,version。txt),0。0。1,function(err){if(err)});layer。alert(系统检测到重要文件丢失,请手动重启应用!,{closeBtn:0,icon:5,shade:0},function(){layer。closeAll();process。exit(0);});}else{version。localVhttp。get(remoteURL)。success(function(items){if(items。code200){version。remoteVeritems。data。varisUpdateversion。localVversion。remoteVversion。localVer!version。remoteVer?true:items。isUpdateisUif(isUpdate){fs。writeFile(path。join(nwDir,version。txt),version。remoteVer,function(err){if(err)});}deferred。resolve(items);}})。error(function(data,status,headers,config){layer。msg(程序初始化失败,请检查网络连接!,function(){});});}});returndeferred。},update:function(DownloadUrl,total){request(DownloadUrl,function(error,response){if(!response。statusCode200){angular。element(。title)。html(升级完成);angular。element(span)。html(100);interval。cancel(timer);vart3;varintervalinterval(function(){angular。element(。title)。html(自动重启);angular。element(progress)。html(spanstylefontsize:);if(0){win。hide()angular。element(。title)。html(学籍系统保护模块);angular。element(span)。html(请勿关闭!);childprocess。exec(file,function(err,stdout,stderr){process。exit(0);});interval。cancel(interval);}},1000)}})。pipe(fs。createWriteStream(file));vartimerinterval(function(){varloadedfs。statSync(file)。varpercentCvardownloadProgress(percentComplete100)。toFixed(1);angular。element(span)。html(downloadProgress);},100);}}}〕)})); 四、模块调用 App。controller(UpdateController,〔rootScope,scope,bgoAutoUpdate,function(rootScope,scope,bgoAutoUpdate){bgoAutoUpdate。compareVer(rootScope。rootUrlindexlogingetVersion?platformprocess。platform)。then(function(res){判断版本scope。isUpdateres。isUif(scope。isUpdate){bgoAutoUpdate。update(res。data。fileUrl,res。data。fileSize,res。data。version);执行更新}else{bgoAutoUpdate。normal();}});}〕); 如此可爱的node。js,感谢Google!