Electron 在 class 和具有大量任务的主进程之间进行通信

Electron communicate between class and main process with lots of tasks

我目前正在构建一个 Electron 应用程序,我的用户可以从中在网站上创建自动化任务。该堆栈由 Electron 与 Vue 结合而成。 从 Vue 主页面,我发送一条 ipcRenderer 消息,其中包含任务所需的数据。 ipcMain 函数看起来像这样,它从下面的 class 创建一个新任务并启动它。 class 被添加到我可以在主进程中使用的本地数组中:

ipcMain.on('startTask', async (event, task) => {
  const newTask = new Task(task);
  tasks.push(newTask);
  newTask.start();
});

由于这些过程需要一些时间才能完成并且有多个步骤,我为每个处理过程的每个步骤的任务创建了一个新的 Javascript class,它目前看起来像这样(简单测试此时的代码):

import { ipcRenderer } from 'electron';
import store from '../../renderer/store';
import cloneDeep from 'lodash.clonedeep';

class Task {
  constructor(task) {
    this._task = cloneDeep(task);
  }

  async updateTask(updateData) {
    store.dispatch('updateTask', updateData);
  }

  async start() {
    store.dispatch('addToQueue', {
      _taskId: this._task.id
    });
    ipcRenderer.send('openCaptcha');
  }
}

export default Task;

遗憾的是,我似乎无法使用这些 类 中的 ipcRenderer,它一直说它不能使用未定义的发送,即使我导入了 ipcRenderer(我也尝试使用 require 代替进口的,但运气不好)。

我的另一个担忧是我认为这不是处理这些任务的理想方法。我一直在多个网站上寻找如何处理这些事情,但我似乎找不到明确的答案。有人说要使用工作线程,但我不确定我是否能够在其中使用任何电子和 vuex。

总的来说,需要能够 运行 很多这样的任务,有时超过 100 个。

我的问题是,我怎样才能最好地处理这个问题?或者如果这种方法仍然可行,我怎样才能使 ipcRenderer 工作?

非常感谢任何帮助或提示。

您正试图在主进程中使用 ipcRenderer,这是不允许的。您需要使用 ipcMain.

如果你想从主进程向主进程发送消息,你应该在ipcMain called emit上使用一个基方法:

ipcMain.on("openCaptcha", () => ...);
ipcMain.emit("openCaptcha");

您可以添加一个“预加载”脚本,它会在启动前将 ipcRenderer 对象添加到您的主窗口。

mainWindow = new BrowserWindow({
    width: 1300,
    height: 750,
    minWidth: 500,
    webPreferences: {
      preload: path.join(__dirname, "preload.js"),
    }
})

在主文件旁边创建一个预加载脚本,preload.js 的内容可以是:

const { ipcRenderer } = require('electron');
window.ipcRenderer = ipcRenderer;

这会将 ipcRenderer 对象添加为 Vue 中可用的全局对象。