gpt4 book ai didi

javascript - Electron:在主渲染器和渲染器中使用相同的单例

转载 作者:行者123 更新时间:2023-12-03 12:33:33 25 4
gpt4 key购买 nike

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

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

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 个左右的方法。似乎需要编写很多额外的代码才能以这种方式完成它。

我发现的另一个解决方案是使用 Electron 的远程模块:

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

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

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

最佳答案

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

只要有一个Prefs类(class)。

然后让您的渲染器从 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);

关于javascript - Electron:在主渲染器和渲染器中使用相同的单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61804758/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com