1

在我提供一些背景知识之前,我想澄清一下,我不是在寻找如何在 Electron 运行时简单地生成一个新脚本作为渲染器进程,我正在尝试使用普通的 Node 运行时。

所以我知道 Electron 在它的引擎盖下有一些不同风格的 JS 运行时,类似于 NW.js,我正试图为我的报告获得一致的性能结果。

不幸的是,这似乎比我想象的要困难得多。我专门测试了mailparser模块的速度,尽管这在这里并不重要。

  1. 我首先在使用 Electron Forge 的 Electron 应用程序上运行它。我通过 IPC 调用了测试脚本,因为这是我们打算使用的,所以它是在回调中调用的ipcMain.handle。在这里,性能真的很差,我们的测试需要 30-50 秒才能完成。

  2. 然后我运行了一个测试脚本,它只在同一个 Electron Forge 应用程序中打开一个空白 HTML 文件,并在后台运行测试脚本。这在 8-12 秒时要好得多。

接下来,我设置了一个新目录,其中包含一个测试集、一个普通的 Electron 安装和一个mailparser安装。我没有electron-rebuild在这里,但mailparser确实依赖于node-iconv本机绑定,因此也有。

  1. 我用 Electron 运行了一个测试脚本,只调用了同一行代码。这没有使用 Electron Forge。这里的性能在 5-9 秒时稍好一些。

  2. 然后我运行了另一个测试脚本,这次只使用普通的旧节点,这里的性能在 1-3 秒时非常出色。

所以我在这里有两个问题:

  1. 为什么电子测试中的性能差异如此之大?虽然我使用了 IPCMain,但我使用了 new .handle,它应该是异步的,并且在 Electron 的节点运行时的上下文中运行,因此它应该具有与在回调之外运行相同的性能。此外,Electron Forge 和普通 Electron 测试也相差几秒钟,这对我来说毫无意义,因为我认为 Electron Forge 只会将 Electron 二进制文件包裹在引擎盖下。

  2. 寻求最佳和一致的结果,我想知道如何使用 Electron 中的节点运行时启动子进程。这样做通常只会启动一个新的渲染器进程,该进程正在运行 Electron 的(较慢的)JS 运行时。我想避免离开 Electron Forge,但我能想到的唯一解决方案是将预编译的二进制文件与在为每个平台构建的 Node 运行时下运行的进程捆绑在一起。

4

1 回答 1

2

对于问题 1,如果无法在代码中复制它,就很难知道问题出在哪里。你可以尝试在 Github 网站上为 Electron 团队发布一个问题。他们更有可能知道答案,但他们也要求提供代码。

话虽如此,启动一个正在运行节点的子进程并让您从 Electron/Electron Forge 开销中解放出来并不难。最简单的方法是使用节点的fork命令,但要告诉它使用主节点可执行文件而不是 electron.exe。您只需将脚本交给它即可运行,因此您无需担心预编译的二进制文件。

下面(和此处)在主进程上运行的代码将在同一文件夹中运行一个名为 server.js 的脚本:

    const serverPath = path.join(__dirname, 'server.js');
    const { fork } = require('child_process');
    child = fork(serverPath, [],
        {
            execPath: "node",
            stdio: ['pipe', 'pipe', 'pipe', 'ipc']
        });

如果这样做,您将获得启用 IPC 的子 node.exe 进程,而不是 electron.exe 进程。它可以通过 IPC 与主 Electron 进程进行通信。它还可以使用从您通常的 package.json 安装的任何 npm 模块,因为该脚本可以与您的其他脚本位于同一文件夹中。因此,如果它有效,这是一个非常干净的解决方案。

今天下午我写了一些代码来娱乐自己。我已经把它放在了 Github 上。它使用 mailparser 在server.js的 node.exe 进程中解析一个简单的邮件。

据我所知,这也与 Electron Forge 正确打包,包括正确的脚本。它不会打包 node 本身,所以要么需要安装在目标机器上,要么我认为你需要分发 node.exe。

顺便说一句,您是否真的尝试过这种方法并不完全清楚,这是它运行缓慢的场景之一。仍然有一些开销,因为我们正在设置 IPC。如果它在您的用例中仍然运行缓慢,那么我认为可以使用节点的 spawn 命令来创建一个完全独立的进程。

于 2020-11-24T20:12:02.847 回答