interfaceStoreType { mm: MyModule } // Declare empty store first const store = newVuex.Store<StoreType>({})
// Create module later in your code (it will register itself automatically) // In the decorator we pass the store object into which module is injected // NOTE: When you set dynamic true, make sure you give module a name @Module({ dynamic: true, store: store, name: 'mm' }) classMyModuleextendsVuexModule { count = 0
在 vite 中,源码出现改动时只会更新必要的部分,因此不会重新加载整个页面,但由于 vuex-module-decorators 不支持热更新,因此会出现重复注册 vuex module 的问题。在控制台会报如下警告。
1
[vuex] duplicate namespace "app" for the namespaced module
解决问题
由于原项目已经年久失修,所以直接 fork 一个分支来改。
原项目使用 TypeScript 来编写,良好的类型提示使得没接触过这个项目的人也能快速看懂。
当然了,这里我们没必要看懂整个项目,只要找下 vuex module 是怎么注册的就行了。
通过翻看源码,我发现了如下内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
// src/module/index.ts function registerDynamicModule<S>(module: Mod<S, any>, modOpt: DynamicModuleOptions) { if (!modOpt.name) { thrownewError('Name of module not provided in decorator options') }
if (!modOpt.store) { thrownewError('Store not provided in decorator options when using dynamic option') }
modOpt.store.registerModule( modOpt.name, // TODO: Handle nested modules too in future module, { preserveState: modOpt.preserveState || false } ) }
function registerDynamicModule<S>(dynamicModule: Mod<S, any>, modOpt: DynamicModuleOptions) { if (!modOpt.name) { thrownewError('Name of module not provided in decorator options') }
if (!modOpt.store) { thrownewError('Store not provided in decorator options when using dynamic option') } if (import.meta.hot) { // 必需的条件守卫, 这样代码就可以在生产环境中被 tree-shaking 优化 // vite 的热更新 if (modOpt.store.hasModule(modOpt.name)) { // 如果遇到重复模块则热更新 modOpt.store.hotUpdate({ modules: { [modOpt.name]: dynamicModule } }) return } modOpt.store.registerModule(modOpt.name, dynamicModule, { preserveState: modOpt.preserveState || false }) return } modOpt.store.registerModule(modOpt.name, dynamicModule, { preserveState: modOpt.preserveState || false }) }
function registerDynamicModule<S>(dynamicModule: Mod<S, any>, modOpt: DynamicModuleOptions) { if (!modOpt.name) { thrownewError('Name of module not provided in decorator options') }
if (!modOpt.store) { thrownewError('Store not provided in decorator options when using dynamic option') } if (module.hot) { // 此处改为 module.hot 来支持 webpack 热更新。 if (modOpt.store.hasModule(modOpt.name)) { // 如果遇到重复模块则热更新 modOpt.store.hotUpdate({ modules: { [modOpt.name]: dynamicModule } }) return } modOpt.store.registerModule(modOpt.name, dynamicModule, { preserveState: modOpt.preserveState || false }) return } modOpt.store.registerModule(modOpt.name, dynamicModule, { preserveState: modOpt.preserveState || false }) }