如何从渲染过程中访问主进程中的对象[Electron]

时间:2018-02-07 15:06:11

标签: javascript node.js electron

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

我创建了一个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 /函数。

我是网络/电子开发的新手;处理这个问题的正确方法是什么?以前我主要处理渲染进程所需的大部分函数,​​但主要开始变得非常臃肿,所以我试图稍微重构它。

2 个答案:

答案 0 :(得分:2)

<强> TL; DR:在接收方侧重新构建对象。

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

如果您在access周围的意图是分享像真正的单身人士这样的引用,那就不可用了。

答案 1 :(得分:0)

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

阅读this article有关主要和渲染器进程之间的差异以及每个进程应该使用的内容。