对插件开发者而言,可能会自然而然地写出这样的代码:
async onload() {
let config = await this.loadData(CONFIG_FILLE);
}
async onunload() {
this.saveData(CONFIG_FILLE, this.config);
}
🐛 但是这种代码实际上会诱发一个潜在的 bug。
假设存在一个设备 A,在 2024-08-27 A 上插件保存了一份 config.json 文件,这份 config.json 文件通过云同步算法放到了远端。
现在有一个设备 B,他的数据版本还停留在 2024-08-01。现在我们在设备 B 上启动思源,会发生如下的事情:
- 思源 B 启动
- 插件启动,读取本地的 2024-08-01 版本的 config.json 文件
- 思源开始同步数据,拉取到了运算的 2024-08-27 的数据
- 本地的 2024-08-01 版本的 config.json 文件被替换为 2024-08-27 版本的 config.json
- 关键步骤来了:当数据版本相差过大的时候,思源会自动重启;在重启的过程中,会 unload 插件,于是插件把运行时读取到的 2024-08-01 版的 config 数据又写回到了本地文件,用旧的版本覆盖了新的版本!
- 思源 B 重启后,插件再次读取了 2024-08-01 版的 config.json 文件,并且同步数据——于是最新的 2024-08-27 的 config 数据就这么丢失了。
💡 为了避免这种情况发生:请不要在 onunload 中保存插件的数据!仅仅在配置信息发生改变的时候,才更新文件。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于