Skip to content

模块开发

Vite TS Starter (VTS) 采用基于模块化的设计架构,通过清晰的目录结构和模块划分,实现高内聚低耦合的代码组织方式。

目录结构

src/
├── assets/          # 静态资源
├── components/      # 公共组件
├── hooks/           # 可复用 Hooks
├── locales/         # 国际化语言包
├── mixins/          # Mixins 文件
├── modules/         # 业务模块均存放到该位置下,每个模块下独享状态
│   ├── Project/        
│   │   ├── api/
│   │   ├── components/
│   │   ├── data/
│   │   ├── pages/
│   │   └── store/
│   ├── Result/
│   │   ├── api/
│   │   ├── components/
│   │   ├── data/
│   │   ├── pages/
│   │   └── store/
│   ├── UserAccount/
│   │   ├── api/
│   │   ├── components/
│   │   ├── data/
│   │   ├── pages/
│   │   └── store/
│   └── ...
├── router/          # 路由配置
├── store/           # 全局状态管理
├── styles/          # 全局样式
├── types/           # TypeScript 类型定义
├── utils/           # 工具函数
└── widgets/         # 通用业务部件

模块化设计

1. 业务模块结构

每个业务模块(modules/目录下)都基本遵循以下标准结构:

ModuleName/
├── api/           # 模块相关的 API 接口
├── components/    # 模块私有组件
├── data/          # 模块数据与配置
├── pages/         # 模块页面
└── store/         # 模块状态管理
    ├── index.ts            # 模块状态入口文件
    ├── mutations-type.ts   # mutation 类型常量
    └── types.ts           # 类型定义

2. 内置模块

VTS 目前已内置了以下三个示例模块,作为其支撑组件,你可以根据自己的需求自由调整:

状态管理

1. 创建/维护模块状态

每个业务模块维护自己的状态管理,遵循以下结构:

ts
// modules/ModuleName/store/index.ts
import type { Module } from 'vuex'
import MUTATION from './mutations-type'
import mixin from '@/store/utils/mixin'
import type { IGlobalState } from '@/store'
import * as ModuleNameAPI from '@/modules/ModuleName/api'
import { sleep } from '@/utils/request'

interface IModuleState {
  // 模块状态类型定义
}

const ModuleStore: Module<IModuleState, IGlobalState> = {
  namespaced: true,
  _name: 'ModuleName',
  state: {
    // 模块状态
    demoInfo: {},
  },
  getters: {
  },
  mutations: {
    [MUTATION.UPDATE_STATE](state, payload) {
      // 状态更新
      state.demoInfo = payload
    }
  },
  actions: {
    async fetchData({ commit }, params) {
      // 异步操作
      const result = await ModuleNameAPI.getData(params)
      await sleep(200)
      commit(MUTATION.UPDATE_STATE, result)
      return this.filterResponse(result)
    }
  },
  ...mixin
}

export default ModuleStore

2. 状态注册

打开 src/store/index.ts,将上一步编写好的模块状态及对应的 Type 引入到对应代码位置:

若已经在这里注册过,请忽略这一步,直接查看3. 状态访问

ts
import { createStore } from 'vuex'

import type { IUserAccountState } from '@/modules/UserAccount/store'
import UserAccount from '@/modules/UserAccount/store'
import type { IProjectModule } from '@/modules/Project/store'
import Project from '@/modules/Project/store'
import type { IResultModule } from '@/modules/Result/store'
import ResultModule from '@/modules/Result/store'

// 1. 引入刚刚创建好的模块状态及对应的 Type
import type { IModuleStore } from '@/modules/ModuleName/store'
import ModuleStore from '@/modules/ModuleName/store'

import plugins from '@/store/plugins'

export interface IGlobalState {
  UserAccount: IUserAccountState
  Result: IResultModule
  Project: IProjectModule

  // 2. 定义全局 Type 类型
  ModuleName: IModuleStore
}

const store = createStore<IGlobalState>({
  modules: {
    UserAccount,
    Project,
    Result: ResultModule,

    // 3. 接着在这里注册
    ModuleName 
  },
  plugins
})

export function setupStore(app: App<Element>) {
  app.use(store)
}

export { store }

3. 状态访问

在组件 setup 中使用

vue
<script setup lang="ts">
import UserAccountModule from '@/modules/ModuleName/store'
const store = useBaseStore()

store.dispatch('ModuleName/fetchData', {
  // ...params
})

const currentDemoInfo = computed(() => store.state.ModuleName.demoInfo)
</script>