【问题标题】:How do I access an object from the main process from a render process [Electron]如何从渲染进程 [Electron] 访问主进程中的对象
【发布时间】:2018-02-09 08:12:27
【问题描述】:

我正在尝试创建一个工具来编辑包含与我的公司业务逻辑相关的对象的文件。我正在使用电子这样做。

我创建了一个 javascript 类,它代表对象、处理其内部结构并在其上提供业务功能:

class Annotation {
    constructor() {
        this._variables = []
        this._resourceGenerators = []
    }

    get variables() {
        return this._variables
    }

    get resourceGenerators() {
        return this._resourceGenerators
    }

    save(path) {
        ...
    }

    static load(path) {
        ...
    }
};

module.exports = Annotation;

我在我的主进程中创建对象,并且我有一个事件处理程序,它允许渲染进程访问它:

const {ipcMain} = require('electron')
const Annotation = require('./annotation.js');

... Do electron window stuff here ...

var annotation = new Annotation()

ipcMain.on('getAnnotation', (event, path) => {

    event.returnValue = annotation
})

我刚刚发现通过 ipcMain.sendSync 发送一个对象使用 JSON.stringify 来传递注释,这意味着它失去了它上面的 getter/functions。

我对网络/电子开发还很陌生;处理这个的正确方法是什么?以前我在 main 中有处理程序来处理渲染进程所需的大部分函数,​​但是 main 开始变得非常臃肿,所以我试图对其进行一些重构。

【问题讨论】:

    标签: javascript node.js electron


    【解决方案1】:

    TL; DR:在接收方重建对象。

    描述:Electron 的主要架构设计是基于多进程,将 main (node.js) 和各个渲染器 (chromium) 进程分离,并允许进程之间通过 IPC 机制进行通信。并且由于几个原因(效率、性能、安全性等)Electron 的 OOTO IPC 只允许发送/接收可序列化的 POJO。一旦接收器拥有这些数据,您可能需要从那里重建所需的对象。

    如果您围绕 access 的意图是共享引用,例如真正的单例,则不可用。

    【讨论】:

    • 在渲染过程中是否有任何类型的模式用于重新创建对象(例如,将其传递给构造函数)?还是我只是创建一个函数,将函数添加到 Annotation 的实例中,然后从构造函数/渲染过程中调用它?
    • 这取决于您的用例。 js有几种实现方式,根据代码设计,有些可能更好,也可能不好。
    【解决方案2】:

    我建议的第一件事是,在大多数情况下,您不需要将任何内容转移到主进程。主进程主要用于创建窗口和访问仅限于主进程的 Electron API。其他一切都应该并且可以从渲染器完成,包括访问所有节点模块。您可以从渲染器写入文件、访问数据库等。

    阅读this article,了解主进程和渲染器进程之间的差异以及各自的用途。

    【讨论】:

    • 我在某处读到,主进程应该用于任何慢速任务,以避免渲染进程变慢?
    • 如果你在任何地方读到它都是错误的!如果您阅读链接的文章,它会解释原因。主进程在渲染器和 GPU 进程之间编组 IPC,因此阻塞实际上也可以挂起所有渲染器。
    • 好吧,我读了那篇文章,但现在我更加困惑了。所以我正在编辑的东西本质上是一个文件。我有 html/js 用于查看它,还有一个单独的 html/js 用于编辑其中的每种类型的对象。我不想在转换页面时保存文件,如何将它从一个渲染线程传递到另一个渲染线程?
    猜你喜欢
    • 2017-05-01
    • 2018-01-05
    • 2017-11-14
    • 2020-04-09
    • 2017-06-01
    • 2019-05-14
    • 2016-11-15
    • 2022-01-11
    • 2022-01-15
    相关资源
    最近更新 更多