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 中可用的全局对象。
我目前正在构建一个 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 中可用的全局对象。