1.安装child_process
npm install child_process --save 复制代码
child_process 子进程
在node中,child_process这个模块非常重要。掌握了它,等于在node的世界开启了一扇新的大门。熟悉shell脚本的同学,可以用它来完成很多有意思的事情,比如文件压缩、增量部署等,nodejs创建子进程有四种方法,分别是
spawn
、fork
、exec
、execFile
。
区别 :
- 格式 : spawn和execFile的格式都是(command,[args]);fork的参数直接(文件名);exec的command相当于spawn的command+args;
- 回调 : spawn和fork没有直接的回调。spawn通过事件监听处理; fork相当于直接执行一个node程序;其余两个有回调,回调的参数为error,stdout,stderr;
- 作用 : [这里我也不是很明白,引用网上的],fork用于启动一个node进程,可以进程进程之间通信;execFile用于执行一个外部应用;spawn方法会在新的进程执行外部应用;exec这个方法将会生成一个子shell,能够在shell中执行命令。
2. 在package.json指向的主进程中
// 控制应用生命周期和创建原生浏览器窗口的模组 const { ipcMain } = require('electron') // 多进程测试 const cp = require("child_process") let mySpawn = new Array() ipcMain.on('open-apifox', (e, msg) => { console.log('打开进程 -> mainProcess:' + msg) const spawn = cp.spawn(msg) cps[cps.length] = spawn e.sender.send('cp-reply', '打开进程:' + msg) }) ipcMain.on('kill-apifox', (e, msg) => { console.log('关闭进程 -> mainProcess:' + msg) e.sender.send('cs-reply', '正在关闭所有打开的应用') // 收到消息,关闭所有进程 for(i = 0; i < cps.length; i++) { cps[i].kill() } cps = new Array() }) 复制代码
ipcMain
模块是类EventEmitter的实例.当在主进程中使用它的时候,它控制着由渲染进程(web page)发送过来的异步或同步消息.从渲染进程发送过来的消息将触发事件.详细说明请查看www.cnblogs.com/zyl-Tara/p/…
**3. 在render渲染层中,触发事件引用外部的exe应用
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <div style="font-weight: bolder">3.打开外部程序,并监听消息</div> <div class="form-group"> <input class="form-control" type="text" name="txt_exe" id="openApifox" style="width:600px" placeholder="输入带路径的外部程序的名称" value="D:\apifox\apifox.exe" /> <div><button onclick="ChildProcess(true)">打开应用</button> <button onclick="ChildProcess(false)">关闭所有应用</button> </div> </div> </body> <script> const ipcRenderer = require('electron').ipcRenderer ipcRenderer.on('cs-reply', (e, msg) => document.getElementById('openApifox').value = msg ) function ChildProcess(isopen) { // 发消息,由html的按钮调用,给主进程发消息,回调中关闭进程 let appname = "" if (isopen) { appname = document.getElementById('openApifox').value console.log(appname) ipcRenderer.send('open-apifox', appname) } else ipcRenderer.send('kill-apifox', appname) } </script> </html>