在Electron的子进程中执行javascript文件

时间:2019-03-23 00:15:33

标签: javascript angular electron

我有一个内置了Angular的Electron应用程序(最新版本)。我需要在子进程中从项目中执行javascript(而非打字稿)文件(一些我不想同步执行的繁重任务)。

尝试过以下解决方案:

1.创建函数Loader,将所有内容放在其中:

export function Loader() { console.log(111); }

然后创建子进程的组件:

import { Loader } from 'some/path/to/loader.js';

public doSomething(): void {
  fork(
    Loader,
    [ ... some string args here ],
    { env: { 'ELECTRON_RUN_AS_NODE': '1' } }
  )
    .on(
      'error',
      (error: Error): void => console.error(error)
    )
    .on(
      'exit',
      async (code: number | null): Promise<void> => {
        if (code === 0) {
          console.log(`Finished with code ${code}`);
          await this.someMethod();
        } else {
          console.error(`Exit code is ${code}`);
        }
      }
    );
}


2.删除Loader函数包装,js文件看起来像

console.log(1111);

在组件中:

public doSomething(): void {
  fork(
    require.resolve('some/path/to/loader.js'),
    [ ... some string args here ],
    { env: { 'ELECTRON_RUN_AS_NODE': '1' } }
  )
    .on(// The same event handling

对于这两种情况,子进程处于生产模式或发布版本均失败,代码为1。放置在Electron的main.ts文件中的相同代码有效。

如何在调用它的位置修复子进程执行?

2 个答案:

答案 0 :(得分:0)

您可能要使用WebWorkers。

您可以将一些繁重的代码移交给网络工作者,并保持主线程畅通无阻。

DTYPE = tf.float32
var = tf.Variable(initial_value=1, dtype=DTYPE)
a = tf.TensorArray(dtype=DTYPE, size=10)
a = a.write(0, var)
a_0 = a.read(0)

b = tf.TensorArray(dtype=DTYPE, size=10)
b = b.write(0, a_0 * 3)
b_0 = b.read(0)
b = b.write(1, b_0 * 3)
b_1 = b.read(1)

print(tf.gradients(a_0, var))
print(tf.gradients(b_0, var))
print(tf.gradients(b_0, a_0))
print(tf.gradients(b_1, b_0))

然后

let win = new BrowserWindow({
  webPreferences: {
    nodeIntegrationInWorker: true
  }
})

https://electronjs.org/docs/tutorial/multithreading

答案 1 :(得分:0)

如果您在渲染器中,我认为您需要使用remote

类似的东西可能起作用:

const { spawn } = window.remote.require('child_process')
const ls = spawn('ls', ['-lh', '/usr'])

ls.stdout.on('data', (data) => {
  console.log(`stdout: ${data}`)
})

ls.stderr.on('data', (data) => {
  console.log(`stderr: ${data}`)
})

在上面,您需要将遥控器连接到窗口:

 <script>
     this.window.remote = require('electron').remote;
 </script>