nodeJS - 通过 CLI 在后台与电子应用程序 运行 通信

nodeJS - Communicate with an electron app running in the background through a CLI

作为我要实现的目标的示例,请考虑从终端启动 VS Code。如果不仅 运行,code <file-name> 命令打开一个 vs 代码实例,否则告诉它打开一个文件。此外,一旦打开,用户可以再次使用终端会话执行其他任务(就好像该进程已被拒绝)。

我的脚本需要以相同的方式与我的电子应用程序交互,唯一的区别是我的应用程序将位于托盘中,而不是在扩展坞中可见。 . 该解决方案只需要在 linux

上工作

使用 unix 套接字服务器进行进程间通信。

电子

const handleIpc = (conn) => {
  conn.setEncoding('utf8');
  conn.on('data',(line) => {
    let args = line.split(' ');
    switch(args[0]) {
      case 'hey': 
        conn.write('whatsup\n');
        break;
      default: conn.write('new phone who this?\n');
    }
    conn.end();
  })
}
const server = net.createServer(handleIpc);
server.listen('/tmp/my-app.sock');

那么你的 CLI 是:

#!/usr/bin/node
const net = require('net');
let args = process.argv;
args.shift(); // Drop /usr/bin/node 
args.shift(); // Drop script path

let line = args.join(' ');
net.connect('/tmp/my-app.sock',(conn)=>{
  conn.setEncoding('utf8');
  conn.on('data',(response)=>{
    console.log(response);
    process.exit(0);
  });
  conn.write(line+'\n');
}).on('error',(err)=>{
  console.error(err);
  process.exit(1);
});

如果我理解正确,您只想保留应用的一个实例并处理启动另一个实例的尝试。在旧版本的 Electron 中,使用 app.makeSingleInstance(callback) was used to achieve this. As for Electron ...v13 - v15, app.requestSingleInstanceLock()second-instance 事件。这是一个如何使用它的例子:

const { app } = require('electron');
let myWindow = null;

const gotTheLock = app.requestSingleInstanceLock();

if (!gotTheLock) {
    app.quit();
} else {
    app.on('second-instance', (event, commandLine, workingDirectory) => {
        // Someone tried to run a second instance
        // Do the stuff, for example, focus the window
        if (myWindow) {
            if (myWindow.isMinimized()) myWindow.restore()
            myWindow.focus()
        }
    })

    // Create myWindow, load the rest of the app, etc...
    app.whenReady().then(() => {
        myWindow = createWindow();
    })
}

所以当有人第二次启动./app arg1 arg2时,回调会被调用。顺便说一句,这个解决方案是跨平台的。