以child_process

时间:2016-02-17 08:50:45

标签: node.js child-process electron

child_process与Atom Electron合作让我感到很麻烦。首先,我使用的是预编译的二进制应用程序,您可以从Electron的网站下载:

  • 我在Mac OS X上使用通常的预编译二进制文件。
  • 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操作(它应该是某种守护进程)然后启动一些{{1来自child.js的{​​{1}}脚本。 child_process应该能够打开窗户以及其他所有窗口。

所以这是我天真的尝试。我只是在index.js剪切并粘贴了上面的示例代码段,然后将child.js编辑成以下代码:

child.js

相当小,对吗?希望它会起作用,但它没有。当我双击我漂亮的应用程序时,没有任何反应。我敢打赌,我是以一种微不足道的方式做错事,但我不能说出什么。

更新1 我将其从我的包中移出,以便我可以获得index.js个。 var child_process = require('child_process'); var my_child = child_process.fork(__dirname + '/child.js'); 的{​​{1}}因错误而死亡:它似乎无法找到它。

更新2 :我在console.log中列出了环境变量,并注意到child.js。我想我应该把它变成require('electron'),但没有任何改变。

1 个答案:

答案 0 :(得分:0)

在Electron child_process.fork()中会生成具有ATOM_SHELL_INTERNAL_RUN_AS_NODE环境变量集的子项,这意味着子进程中没有Chromium功能可用(因此没有Electron内置模块),所有你和#39; ll get是vanilla Node运行时加上可以在ASAR文件中读取的修补fs。如果您查看child_process.fork()的代码,您会发现无法覆盖ATOM_SHELL_INTERNAL_RUN_AS_NODE的值。如果可以的话,请使用child_process.spawn(),否则我猜您可以尝试打开问题,并询问Electron团队是否愿意修改当前行为。