架构设计方面
- 命名空间规划:
- 为每个子应用的Vuex模块分配独立的命名空间。例如,子应用A的模块命名空间可以是
subAppA
,子应用B的模块命名空间可以是subAppB
。这样在全局Vuex实例中,各个子应用的模块相互隔离,有效避免命名冲突。
- 命名空间的命名规则应遵循一定的约定,比如采用子应用名称或功能模块名称作为前缀,保证命名的唯一性和可读性。
- 状态共享与隔离策略:
- 状态隔离:利用命名空间,每个子应用的Vuex模块只管理自身相关的状态。例如,子应用A负责用户登录状态的部分,就只在
subAppA
命名空间下管理与A应用相关的登录状态,其他子应用不能直接访问该状态,除非通过特定的接口。
- 状态共享:对于需要共享的状态,可以创建一个独立的共享模块。例如,用户的全局配置信息,可以放在一个
shared
命名空间的模块中。子应用可以通过Vuex的mapState
等辅助函数来获取共享状态。同时,为了保证共享状态的一致性,在共享模块中定义严格的修改规则,通过mutation来统一修改共享状态。
- 模块划分原则:
- 根据子应用的功能模块进行Vuex模块划分。例如,子应用中有用户管理、订单管理等功能,分别对应
userModule
和orderModule
等模块,并且这些模块都在子应用的命名空间下。这样的划分使得每个模块职责清晰,易于维护和管理。
- 避免模块过大,对于复杂功能模块可以进一步细分。比如
userModule
如果包含过多逻辑,可以再细分为userLoginModule
、userProfileModule
等。
代码实现方面
- 创建命名空间模块:
在Vuex模块定义时,通过设置
namespaced: true
来开启命名空间。例如:
// subAppA的user模块
const subAppAUserModule = {
namespaced: true,
state: {
userInfo: null
},
mutations: {
setUserInfo(state, info) {
state.userInfo = info;
}
},
actions: {
async fetchUserInfo({ commit }) {
// 模拟异步获取用户信息
const response = await fetch('/api/userInfo');
const data = await response.json();
commit('setUserInfo', data);
}
}
};
- 访问命名空间模块的状态和方法:
- 获取状态:在组件中使用
mapState
辅助函数时,指定命名空间。例如,在子应用A的组件中获取subAppAUserModule
的状态:
import { mapState } from 'vuex';
export default {
computed: {
...mapState('subAppA/user', ['userInfo'])
}
};
- 调用mutation和action:使用
mapMutations
和mapActions
辅助函数时同样指定命名空间。例如:
import { mapMutations, mapActions } from 'vuex';
export default {
methods: {
...mapMutations('subAppA/user', ['setUserInfo']),
...mapActions('subAppA/user', ['fetchUserInfo'])
},
created() {
this.fetchUserInfo();
}
};
- 共享模块实现:
// shared模块
const sharedModule = {
namespaced: true,
state: {
globalConfig: {}
},
mutations: {
setGlobalConfig(state, config) {
state.globalConfig = config;
}
},
actions: {
async fetchGlobalConfig({ commit }) {
// 模拟异步获取全局配置
const response = await fetch('/api/globalConfig');
const data = await response.json();
commit('setGlobalConfig', data);
}
}
};
import { mapState } from 'vuex';
export default {
computed: {
...mapState('shared', ['globalConfig'])
}
};
- 性能优化:
- 懒加载模块:对于一些不常用的模块,可以采用懒加载的方式。在Vuex中,可以通过动态注册模块来实现。例如,子应用中有一个很少使用的报表功能模块,可以在需要时再动态注册:
// 在需要时动态注册报表模块
import reportModule from './reportModule';
this.$store.registerModule('subAppA/report', reportModule);
- 减少不必要的状态更新:在mutation中,通过深度比较等方式,只有当状态真正发生变化时才更新。例如,使用
lodash
的isEqual
方法:
import isEqual from 'lodash/isEqual';
const subAppAUserModule = {
namespaced: true,
state: {
userInfo: null
},
mutations: {
setUserInfo(state, newInfo) {
if (!isEqual(state.userInfo, newInfo)) {
state.userInfo = newInfo;
}
}
}
};