【问题标题】:Electron: Use same singleton in main and rendererElectron:在主渲染器和渲染器中使用相同的单例
【发布时间】:2020-08-31 10:11:14
【问题描述】:

我正在尝试创建一个适用于主进程和渲染器进程的单例类,但我不确定最好的方法是什么。

例如,我有一个处理存储数据的类:

class Prefs {
    constructor() {
        this.prefsCache = // Load the prefs from a json file into the cache
    }

    set(key, value) {
        this.prefsCache[key] = value
        // Also save the prefs to disk here
    }

    get(key) {
        return this.prefsCache[key]
    }
}

export default new Prefs()

这在单个进程中效果很好,但是如果主进程和渲染器中需要该类,则缓存将变得不同步,因为每个进程都有不同的实例,因此更改了偏好设置。

看起来解决方案是使用IPC,但我找不到一个优雅的解决方案。在这里,我创建了两个不同的类。 PrefsMain 处理保存和存储数据,PrefsRenderer 将与 PrefsMain 通信:

class PrefsMain {
    constructor() {
        ipcMain.on('set-prefs-value', (event, key, newValue) => {
            this.set(key, newValue)
        })
    }

    set(key, value) {
        // ...
    }
}

class PrefsRenderer {
    set(key, newValue) {
        ipcRenderer.sendSync('set-prefs-value', key, newValue)
    }
}

做类似上面的事情,但实际上,我有多个单例,每个都有 20 个左右的方法。似乎需要编写很多额外的代码才能以这种方式完成。

我找到的另一个解决方案是使用电子的远程模块:

const Prefs = require('electron').remote.require('./prefs.js')

这也可以,但它看起来像远程模块is going to be deprecated,所以我宁愿不这样做。

有没有更好的解决方案?如何优雅地创建一个可以在主进程和渲染器进程中使用的单例类,而不必为每个进程创建一个重复的 IPC 处理程序类?

【问题讨论】:

  • 你不能为此使用electron-settings 包吗? ,这个逻辑已经实现了

标签: javascript node.js electron singleton ipc


【解决方案1】:

您不需要创建两个单独的类。

只有一个 Prefs 类。

然后,为了让您的渲染器从 Prefs 单例中设置或获取内容,您需要将 ipc 处理程序添加到您的主进程:

ipcMain.on("setIntoPrefs", (event, key, value) => {
    prefsInstance.set(key, value);
});

ipcMain.handle("getPrefsValue", (event, key) => prefsInstance.get(key));

你的渲染器会这样做:

ipcRenderer.send("setIntoPrefs", key, val);

const val = await ipcRenderer.invoke("getPrefsValue", key);

【讨论】:

  • 如果我的单例不是那么简单,并且有 20 多种方法来管理数据库怎么办?我是否必须编写 20 多个 ipc 事件处理程序来处理每一个?如果是这样,不仅费力,而且在可扩展性方面也受到限制。
  • @Nicholas 如果方法有些相关,您可以为许多方法设置一个通道,并且您传递的参数之一是您想要执行的特定操作。但是,是的,您在进程之间确实需要一些 IPC。是单通道还是多通道取决于您
猜你喜欢
  • 2021-05-13
  • 1970-01-01
  • 2017-05-01
  • 2017-06-01
  • 2017-11-18
  • 2020-04-09
  • 2018-06-13
  • 2017-04-03
  • 2020-11-15
相关资源
最近更新 更多