Node.js 将主进程作为子进程运行
我在处理原子电子时遇到了麻烦。首先,我正在使用预编译的二进制应用程序,您可以从Electron的网站下载:Node.js 将主进程作为子进程运行,node.js,child-process,electron,Node.js,Child Process,Electron,我在处理原子电子时遇到了麻烦。首先,我正在使用预编译的二进制应用程序,您可以从Electron的网站下载: 我在MacOSX上使用通常的预编译二进制文件 在myapp.app/Contents/Resources中,我制作了一个文件夹应用程序,如前所述 我在其中添加了一个简短的package.json,将index.js设置为主脚本 现在,如果我向index.js添加以下代码片段: 'use strict'; var electron = require('electron'); var
- 我在MacOSX上使用通常的预编译二进制文件
- 在
中,我制作了一个文件夹应用程序,如前所述myapp.app/Contents/Resources
- 我在其中添加了一个简短的
,将package.json
设置为主脚本index.js
index.js
添加以下代码片段:
'use strict';
var electron = require('electron');
var app = electron.app;
const BrowserWindow = electron.BrowserWindow;
var mainWindow;
function createWindow () {
mainWindow = new BrowserWindow({width: 800, height: 600});
mainWindow.loadURL('file://' + __dirname + '/index.html');
mainWindow.webContents.openDevTools();
mainWindow.on('closed', function()
{
mainWindow = null;
});
}
app.on('ready', createWindow);
app.on('window-all-closed', function () {
if (process.platform !== 'darwin')
{
app.quit();
}
});
app.on('activate', function () {
if (mainWindow === null)
{
createWindow();
}
});
(这基本上就是让事情正常运行的示例代码)一切正常。我有窗户,我可以让它做任何事情
现在,由于与更新相关的原因,我需要稍微改变一下这个范例。我需要的是能够从index.js
执行多个任务,而无需执行任何gui操作(它应该是某种守护进程),然后从index.js
启动一些child.js
脚本作为子进程child.js
应该能够打开窗口和所有其他窗口
这是我天真的尝试。我只是在child.js
中剪切并粘贴了上面的示例片段,然后将index.js
编辑成以下内容:
var child_process = require('child_process');
var my_child = child_process.fork(__dirname + '/child.js');
很小,对吧?希望它能起作用,但没有。当我双击我的漂亮应用程序时,什么也没发生。我打赌我做错了一些琐碎的事情,但我不知道是什么
更新1我将其从包中移出,以便获得console.log
schild.js
在require('electron')
处出错死亡:它似乎无法找到它
更新2:我在child.js
中列出了环境变量,并注意到一个ATOM\u SHELL\u INTERNAL\u RUN\u AS\u NODE=1
。我想我应该将其设置为0
,但没有任何改变。在Electron中会生成环境变量设置为的子进程,这意味着子进程中没有可用的Chromium功能(因此没有Electron内置模块),您将获得的只是vanilla节点运行时和一个补丁的fs
,它可以读取ASAR文件。如果查看child\u process.fork()
的代码,您将看到无法重写ATOM\u SHELL\u INTERNAL\u RUN\u AS\u NODE
的值。如果可以,请使用child\u process.spawn()
,如果失败,我想您可以尝试打开一个问题,询问Electron团队是否愿意修改当前行为。生成的进程是否应该以分离模式运行?让index.js
和child.js
互相交流对我来说很重要。老实说,我不太熟悉分离进程的产生,尽管这似乎会阻止父进程和子进程通过stdio管道进行通信。我建议打开一个问题来更改child\u process.fork()
,以尊重ATOM\u SHELL\u INTERNAL\u RUN\u AS\u NODE
环境变量的现有值,而不是总是设置它。