Node.js 将主进程作为子进程运行

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

我在处理原子电子时遇到了麻烦。首先,我正在使用预编译的二进制应用程序,您可以从Electron的网站下载:

  • 我在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
s
child.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
环境变量的现有值,而不是总是设置它。