当前位置: 首页 > 后端技术 > Node.js

Electron折腾笔记

时间:2023-04-03 14:01:53 Node.js

后台每次开发都需要手动开启三个服务:server、webpack、grunt,每个服务都需要输入一些东西(端口号、项目名称、项目类型、launcher名称)。而且在推送和调试的时候,这三个服务很容易被终止,然后又得一个一个启动。总之,他们一天要来这里不下十次。看图:想着如果可以一键启动三个服务,省得自己手动输入参数,偷懒的时间岂不是多了一点?功能一键启动关闭项目开发过程中需要开启的三个服务,自动解析出服务运行所需的三个不同目录,省去一一手动输入的麻烦。下次不用配置就可以保存配置开始工作,因为想做成小软件的形式,所以选择了Electron。下面是一些主要思路和功能代码记录。Toolwindow工具窗口部分,基本上用官网指南中的代码就可以了newBrowserWindow({width:400,height:680,resizable:true,title:'prensterTool',})win.loadURL(`file://${__dirname}/index.html`)win.on("close",()=>{win=null;});}app.on("ready",createWdindow);//退出app.on('window-all-closed',()=>{当所有窗口关闭时//在macOS上,大多数应用程序及其菜单栏//保持活动状态,除非用户使用Cmd+Q明确退出。if(process.platform!=='darwin'){app.quit();}});app.on('activate',()=>{//在macOS上,当单击停靠栏图标并且应用程序没有打开窗口时,//大多数应用程序将重新创建一个窗口。if(mainWindow===null){createWindow();}});自定义菜单constremote=require('electron').remote;constMenu=remote.Menu;constMenuItem=remote.MenuItem;vartemplate=[{label:'Configuration',submenu:[{label:'Reconfiguration',accelerator:'CmdOrCtrl+shift+alt+r',点击:function(){reset();}},{label:'SaveConfiguration',accelerator:'CmdOrCtrl+shift+alt+s',click:function(){saveSetting();}}]}//...];varmenu=Menu.buildFromTemplate(模板);Menu.setApplicationMenu(菜单);在工作目录下保存配置信息,拖拽gadget时,读取文件目录写入配置文件,以供后面的功能使用。读取文件路径:varfile=e.dataTransfer.files[0];presenterPath=file.path;显示信息(演示者路径);写入配置文件vardata=`module.exports=`{projectName:"${projectName}",presenterId:"${presenterId}"}`;fs.writeFile("./resources/app/project_config.js",data,function(err){if(err){showInfo(err.toString());return;}调用服务调用服务部分主要使用nodejs的子进程exec.functonstartServices(){//webpackvarprocessWebpack=childProcess.exec('webpack--watch',{'cwd':`${__path}/presenters/SubjectToolSolution/${presenterId}/src`});showLog('Webpack',processWebpack);pids.push(processWebpack.pid);//servervarprocessServices=childProcess.exec('nodeservices',{'cwd':__path});showLog('Server',processServices);pids.push(processServices.pid);//gruntvarprocessGrunt=childProcess.exec('nodegruntTask',{'cwd':__dirname});showLog('Grunt',processGrunt);pids.push(processGrunt.pid);}踩坑Electron在关闭的时候不会关闭node的子进程,所以必须手动关闭。我开始做的时候,服务总是偶尔启动成功,然后就不行了。这很奇怪。找了一下午无果,直到无意中打开任务管理器,看到了一堆node服务...思路:启动服务时,保存子进程的pid,后面kill.varplatform=process.platform;functionkillTask??(){try{if(platform==='win32'){for(letpidofpids){childProcess.exec('taskkill/pid'+pid+'/T/F');}pids=[];}else{for(letpidofpids){process.kill(processServices.pid);}pids=[];}}catch(e){showInfo('未找到pid');}domLog.innerHTML="";showInfo("服务已经停止!");clearInterval(timerId);}Electron封装后,代码中的路径发生了变化,需要手动处理。不知道是不是姿势不对?ELectron打包关于打包的问题,??看官网文档的时候真的是一头雾水。知乎专栏这篇文章不错。可以参考https://zhuanlan.zhihu.com/p/...安装electron-packager的步骤:```npminstall--save-develectron-packager```在package.json中添加打包命令:“脚本”:{“开始”:“电子。”,“包”:“电子包装商。/app--win--outpresenterTool--arch=x64--version1.3.4--overwrite--ignore=node_modules"}执行:npmrun-scriptpackageparameterelectron-packager<项目位置><项目名称><平台><架构><电子版><可选选项>项目位置:应用目录;项目名称:应用名称;platform:待打包的平台;体系结构:x86或x64体系结构;electronversion:电子版(非应用版);可选选项:其他选项;第一次打包,会下载对应的包。时间长了记得在打包参数里面写overwrite,不然后面打包的时候不会重新构建最后上一篇初步完成后的运行图:【原创博客】http://yohnz.github.io/2016/0...