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
时,回调会被调用。顺便说一句,这个解决方案是跨平台的。
作为我要实现的目标的示例,请考虑从终端启动 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
时,回调会被调用。顺便说一句,这个解决方案是跨平台的。