有一个 Vue.js 应用程序将其状态和用户设置作为序列化对象存储在 localStorage 中,如下所示:
export default {
data() {
return {
config: {
someKey1: "someValue",
someKey2: "someValue2",
somekey3: ["one", "two", "three"],
//...
},
appname: "myApp",
};
},
mounted() { //при загрузке
let savedConfig = localStorage.getItem(this.appname . '_config');
if (savedConfig !== null) {
this.config = JSON.parse(savedConfig);
}
},
updated() { //при изменении состояния
let savingConfig = JSON.stringify(this.config);
localStorage.setItem(this.appname . '_config', savingConfig);
},
//Проверки, валидации и весь не относящийся к вопросу код опущен
};
它有效。
但是在应用程序发生重大更新(添加/更改逻辑等)的情况下,对象config可能会发生很大变化。然后,位于用户浏览器中的副本将变得无关紧要。
在这种情况下,如何正确确定应用程序版本已更改的条件以及如何在客户端上重建此对象,最好保存用户所做的所有/大部分设置?是否有任何既定的方法来解决这个问题?
我是这样推理的:
WHERE domain="user" AND version="1.0.0"不能写查询。无需输入,值始终为字符串现在怎么办
结构
假设您需要存储有关用户(用户)的数据。
您可以像这样获取用户名:
有一个版本(为简单起见,我没有做语义版本控制
1.0.0.0-...,只是v1)、一个用户域user、一个方面/模型、个人数据personal_data和名称本身。我建议至少在一般意义上熟悉 DDD 的概念。这样就可以为以后的配置打下基础。
我们弄清楚了结构,然后我们将进化代码。
本地存储的立面
写起来
localStorage.getItem...不舒服。因此,我们制作了一个门面。结果会是这样:settings.get("user", "personal_data", "name"). 或者,也许我们使用点表示法:user.personal_data.name.在门面会有getter 和setter。也许,第一次,值得将所有属性放入一个对象中,并已经使用它。
就像.
JSON.parse_JSON.stringify在 Vue 中,Vuex很适合这个,它非常适合这里,我会使用它。Vuex 有模块。最好将用户设置和状态分离到不同的 Vuex 模块中。也许那时不需要版本控制。
版本控制和迁移
假设
name新版本v2现在称为firstName.该变量在脚本
releaseVersion = 'v2'和 localStorage中设置userVersion = 'v1'。该脚本看到版本不同并执行迁移:
在这个阶段,我推荐使用 TDD(测试驱动开发)。第一个测试是检查名称是否已被移植。
之后,我们开始把逻辑复杂化:
"user:personal_data:name": "user:personal_data:firstName", ...没有 TDD 几乎不可能实现这一点,你会感到困惑和吐槽。
附言
我也查看了现成的 JS 包,但没有找到合适的。
如果您有遗留代码,请创建一个适用于遗留和现代实现的外观。当你摆脱遗留物时,门面可能会爆炸。