返回

Vuex 源码学习系列 - 七、Vuex 模块安装的实现

前端

在前面的文章中,我们已经学习了 Vuex 的基本概念、Vuex 的实现原理,以及 Vuex 的基本使用。在本章中,我们将重点学习 Vuex 模块安装的实现。

Vuex 模块安装的实现

action、mutation、getter 的收集

Vuex 模块安装时,需要收集模块中的 action、mutation、getter。具体实现如下:

function installModule (store, module, path = []) {
  // 获取模块的 namespace
  const namespace = module.namespace || path.join('/');
  // 获取模块的 action
  const actions = module.actions;
  if (actions) {
    for (const key in actions) {
      const action = actions[key];
      const type = namespace + '/' + key;
      store._actions[type] = { fn: action, namespace };
    }
  }
  // 获取模块的 mutation
  const mutations = module.mutations;
  if (mutations) {
    for (const key in mutations) {
      const mutation = mutations[key];
      const type = namespace + '/' + key;
      store._mutations[type] = { fn: mutation, namespace };
    }
  }
  // 获取模块的 getter
  const getters = module.getters;
  if (getters) {
    for (const key in getters) {
      const getter = getters[key];
      const type = namespace + '/' + key;
      store._getters[type] = getter;
    }
  }
  // 递归安装子模块
  const modules = module.modules;
  if (modules) {
    for (const key in modules) {
      installModule(store, modules[key], path.concat(key));
    }
  }
}

Vuex 模块安装的逻辑

Vuex 模块安装的逻辑如下:

  1. 收集模块中的 action、mutation、getter。
  2. 将收集到的 action、mutation、getter 添加到 store 中。
  3. 递归安装子模块。

Vuex 代码优化

Vuex 模块安装的代码可以进行一些优化,优化后的代码如下:

function installModule (store, module, path = []) {
  // 获取模块的 namespace
  const namespace = module.namespace || path.join('/');
  // 收集模块中的 action、mutation、getter
  const actions = module.actions;
  const mutations = module.mutations;
  const getters = module.getters;
  // 将收集到的 action、mutation、getter 添加到 store 中
  for (const key in actions) {
    const action = actions[key];
    const type = namespace + '/' + key;
    store._actions[type] = { fn: action, namespace };
  }
  for (const key in mutations) {
    const mutation = mutations[key];
    const type = namespace + '/' + key;
    store._mutations[type] = { fn: mutation, namespace };
  }
  for (const key in getters) {
    const getter = getters[key];
    const type = namespace + '/' + key;
    store._getters[type] = getter;
  }
  // 递归安装子模块
  const modules = module.modules;
  if (modules) {
    for (const key in modules) {
      installModule(store, modules[key], path.concat(key));
    }
  }
}

Vuex 初始化流程梳理

Vuex 初始化流程如下:

  1. 创建 Vuex 实例。
  2. 安装 Vuex 插件。
  3. 注册 Vuex 模块。
  4. 创建 Vuex 根组件。
  5. 将 Vuex 实例注入 Vuex 根组件。

总结

在本章中,我们重点学习了 Vuex 模块安装的实现。我们了解了 Vuex 模块安装的逻辑,以及 Vuex 代码优化的方案。最后,我们梳理了 Vuex 初始化的流程。希望通过本章的学习,能够帮助读者更深入地理解 Vuex 的实现原理,并能够在实际项目中更好地使用 Vuex。