Skip to content

Module Development โ€‹

Vite TS Starter (VTS) adopts a modular design architecture, achieving high cohesion and low coupling through a clear directory structure and module division.

Directory Structure โ€‹

src/
โ”œโ”€โ”€ assets/          # Static Resources
โ”œโ”€โ”€ components/      # Shared Components
โ”œโ”€โ”€ hooks/           # Reusable Hooks
โ”œโ”€โ”€ locales/         # i18n Languages
โ”œโ”€โ”€ mixins/          # Mixins
โ”œโ”€โ”€ modules/         # Business modules are stored here, each module has its own state
โ”‚   โ”œโ”€โ”€ Project/        
โ”‚   โ”‚   โ”œโ”€โ”€ api/
โ”‚   โ”‚   โ”œโ”€โ”€ components/
โ”‚   โ”‚   โ”œโ”€โ”€ data/
โ”‚   โ”‚   โ”œโ”€โ”€ pages/
โ”‚   โ”‚   โ””โ”€โ”€ store/
โ”‚   โ”œโ”€โ”€ Result/
โ”‚   โ”‚   โ”œโ”€โ”€ api/
โ”‚   โ”‚   โ”œโ”€โ”€ components/
โ”‚   โ”‚   โ”œโ”€โ”€ data/
โ”‚   โ”‚   โ”œโ”€โ”€ pages/
โ”‚   โ”‚   โ””โ”€โ”€ store/
โ”‚   โ”œโ”€โ”€ UserAccount/
โ”‚   โ”‚   โ”œโ”€โ”€ api/
โ”‚   โ”‚   โ”œโ”€โ”€ components/
โ”‚   โ”‚   โ”œโ”€โ”€ data/
โ”‚   โ”‚   โ”œโ”€โ”€ pages/
โ”‚   โ”‚   โ””โ”€โ”€ store/
โ”‚   โ””โ”€โ”€ ...
โ”œโ”€โ”€ router/          # Routing Configuration
โ”œโ”€โ”€ store/           # Global State Management
โ”œโ”€โ”€ styles/          # Global Styles
โ”œโ”€โ”€ types/           # TypeScript Type Definitions
โ”œโ”€โ”€ utils/           # Utility Functions
โ””โ”€โ”€ widgets/         # Common Business Widgets

Modular Design โ€‹

1. Business Module Structure โ€‹

Each business module (under the modules/ directory) generally follows the following standard structure๏ผš

ModuleName/
โ”œโ”€โ”€ api/           # HTTP API Interfaces
โ”œโ”€โ”€ components/    # Private Components
โ”œโ”€โ”€ data/          # Module Data and Configuration
โ”œโ”€โ”€ pages/         # Route pages
โ””โ”€โ”€ store/         # Module State Management
    โ”œโ”€โ”€ index.ts            # Module State Entry File
    โ”œโ”€โ”€ mutations-type.ts   # Mutation Type Constants
    โ””โ”€โ”€ types.ts            # Type Definitions

2. Built-in Modules โ€‹

VTS currently includes the following three example modules as supporting components. You can adjust them according to your needs:

State Management โ€‹

1. Edit Module State โ€‹

Each business module maintains its own state management, following the structure below๏ผš

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 {
  // Module State Type Definitions
}

const ModuleStore: Module<IModuleState, IGlobalState> = {
  namespaced: true,
  _name: 'ModuleName',
  state: {
    // Module State
    demoInfo: {},
  },
  getters: {
  },
  mutations: {
    [MUTATION.UPDATE_STATE](state, payload) {
      // State Update
      state.demoInfo = payload
    }
  },
  actions: {
    async fetchData({ commit }, params) {
      // Async HTTP
      const result = await ModuleNameAPI.getData(params)
      await sleep(200)
      commit(MUTATION.UPDATE_STATE, result)
      return this.filterResponse(result)
    }
  },
  ...mixin
}

export default ModuleStore

2. State Registration โ€‹

Open src/store/index.ts๏ผŒand import the module state and corresponding Type into the appropriate code location:

If you have already registered here, please skip this step and proceed to3. State Access

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. Import the newly created module state and corresponding 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. Define the global Type
  ModuleName: IModuleStore
}

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

    // 3. Register here
    ModuleName 
  },
  plugins
})

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

export { store }

3. State Access โ€‹

Use in the component 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>