我试图创建一个在主进程和渲染器进程中都能使用的单人类,但我不知道最好的方法是什么。
例如,我有一个处理存储数据的类。
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')
这也行得通,但看起来远程模块... ... 将会被废弃,所以我宁愿不这样做。
有没有更好的解决方案?我怎样才能优雅地创建一个既能在主进程又能在渲染器进程中使用的单人类,而不必为每个进程创建一个重复的IPC处理程序类?
你不需要创建两个单独的类。
只要有一个 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);