\n```\n\n### 2. Состояние (store/)\n\nВуекс модуль или Pinia store для управления состоянием:\n\n```javascript\n// store/users.module.js (Vuex)\nconst state = () => ({\n users: [],\n loading: false,\n error: null\n});\n\nconst mutations = {\n SET_USERS(state, users) {\n state.users = users;\n },\n SET_LOADING(state, loading) {\n state.loading = loading;\n }\n};\n\nconst actions = {\n async fetchUsers({ commit }) {\n commit('SET_LOADING', true);\n try {\n const users = await userService.getUsers();\n commit('SET_USERS', users);\n } catch (error) {\n commit('SET_ERROR', error);\n } finally {\n commit('SET_LOADING', false);\n }\n }\n};\n\nconst getters = {\n activeUsers: (state) => state.users.filter(u => u.active)\n};\n\nexport default { namespaced: true, state, mutations, actions, getters };\n```\n\nИли с Pinia:\n\n```javascript\n// store/users.store.js (Pinia)\nimport { defineStore } from 'pinia';\nimport { ref, computed } from 'vue';\n\nexport const useUsersStore = defineStore('users', () => {\n const users = ref([]);\n const loading = ref(false);\n\n const activeUsers = computed(() => users.value.filter(u => u.active));\n\n const fetchUsers = async () => {\n loading.value = true;\n try {\n users.value = await userService.getUsers();\n } finally {\n loading.value = false;\n }\n };\n\n return { users, loading, activeUsers, fetchUsers };\n});\n```\n\n### 3. Сервисы (services/)\n\nБизнес-логика и работа с API:\n\n```javascript\n// services/userService.js\nimport { api } from '@/services/api';\n\nexport const userService = {\n async getUsers() {\n const { data } = await api.get('/users');\n return data;\n },\n\n async createUser(userData) {\n const { data } = await api.post('/users', userData);\n return data;\n },\n\n async updateUser(id, userData) {\n const { data } = await api.put(`/users/${id}`, userData);\n return data;\n },\n\n async deleteUser(id) {\n await api.delete(`/users/${id}`);\n }\n};\n```\n\n### 4. Маршруты (router/)\n\nМаршруты, относящиеся к модулю:\n\n```javascript\n// router/users.routes.js\nexport const usersRoutes = [\n {\n path: '/users',\n component: () => import('../views/UsersPage.vue'),\n meta: { requiresAuth: true },\n children: [\n {\n path: ':id',\n component: () => import('../views/UserDetailPage.vue')\n }\n ]\n }\n];\n```\n\n### 5. Типы (types/)\n\nTypeScript типы для модуля:\n\n```typescript\n// types/user.types.ts\nexport interface User {\n id: string;\n name: string;\n email: string;\n active: boolean;\n createdAt: Date;\n}\n\nexport interface CreateUserDTO {\n name: string;\n email: string;\n}\n```\n\n## Как регистрировать модуль в приложении\n\n### Vuex\n\n```javascript\n// store/index.js\nimport { createStore } from 'vuex';\nimport usersModule from '@/modules/users/store/users.module';\n\nexport default createStore({\n modules: {\n users: usersModule\n }\n});\n```\n\n### Маршруты\n\n```javascript\n// router/index.js\nimport { createRouter, createWebHistory } from 'vue-router';\nimport { usersRoutes } from '@/modules/users/router';\n\nconst routes = [\n ...usersRoutes,\n // другие модули\n];\n\nexport default createRouter({ history: createWebHistory(), routes });\n```\n\n## Экспорт модуля\n\n```javascript\n// modules/users/index.js\nexport { default as usersModule } from './store/users.module';\nexport { usersRoutes } from './router';\nexport { userService } from './services/userService';\nexport * from './types';\n```\n\n## Преимущества модульной структуры\n\n1. **Изоляция** — компоненты и логика не пересекаются\n2. **Переиспользование** — модуль можно скопировать в другой проект\n3. **Масштабируемость** — легко добавлять новые модули\n4. **Тестирование** — проще тестировать отдельный модуль\n5. **Совместная работа** — разные разработчики работают в разных модулях\n\nМодуль должен быть полностью независимым и содержать всё необходимое для функционирования фичи.","dateCreated":"2026-04-03T17:51:35.337765","upvoteCount":0,"author":{"@type":"Person","name":"claude-haiku-4.5"}}}}
← Назад к вопросам

Что будет внутри отдельного модуля приложения на Vue?

1.3 Junior🔥 101 комментариев
#Soft Skills и рабочие процессы

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI3 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Структура модуля в Vue приложении

Модуль в Vue — это изолированная часть приложения, которая инкапсулирует компоненты, состояние, маршруты и сервисы для конкретной фичи. Это позволяет масштабировать приложение и избежать конфликтов имён.

Типичная структура модуля

src/
modules/
  users/
    components/
      UserList.vue
      UserForm.vue
      UserProfile.vue
    views/
      UsersPage.vue
    store/
      users.module.js    // Vuex или Pinia
    services/
      userService.js
      api.js
    types/
      user.types.ts
    router/
      index.js           // Маршруты модуля
    index.js             // Экспорт модуля

Главные компоненты модуля

1. Компоненты (components/)

Уникальные для этого модуля компоненты:

// components/UserForm.vue
<template>
  <form @submit.prevent="handleSubmit">
    <input v-model="form.name" placeholder="Name" />
    <button type="submit">Create User</button>
  </form>
</template>

<script setup>
import { reactive } from 'vue';
import { userService } from '../services/userService';

const form = reactive({ name: '' });

const handleSubmit = async () => {
  await userService.createUser(form);
};
</script>

2. Состояние (store/)

Вуекс модуль или Pinia store для управления состоянием:

// store/users.module.js (Vuex)
const state = () => ({
  users: [],
  loading: false,
  error: null
});

const mutations = {
  SET_USERS(state, users) {
    state.users = users;
  },
  SET_LOADING(state, loading) {
    state.loading = loading;
  }
};

const actions = {
  async fetchUsers({ commit }) {
    commit('SET_LOADING', true);
    try {
      const users = await userService.getUsers();
      commit('SET_USERS', users);
    } catch (error) {
      commit('SET_ERROR', error);
    } finally {
      commit('SET_LOADING', false);
    }
  }
};

const getters = {
  activeUsers: (state) => state.users.filter(u => u.active)
};

export default { namespaced: true, state, mutations, actions, getters };

Или с Pinia:

// store/users.store.js (Pinia)
import { defineStore } from 'pinia';
import { ref, computed } from 'vue';

export const useUsersStore = defineStore('users', () => {
  const users = ref([]);
  const loading = ref(false);

  const activeUsers = computed(() => users.value.filter(u => u.active));

  const fetchUsers = async () => {
    loading.value = true;
    try {
      users.value = await userService.getUsers();
    } finally {
      loading.value = false;
    }
  };

  return { users, loading, activeUsers, fetchUsers };
});

3. Сервисы (services/)

Бизнес-логика и работа с API:

// services/userService.js
import { api } from '@/services/api';

export const userService = {
  async getUsers() {
    const { data } = await api.get('/users');
    return data;
  },

  async createUser(userData) {
    const { data } = await api.post('/users', userData);
    return data;
  },

  async updateUser(id, userData) {
    const { data } = await api.put(`/users/${id}`, userData);
    return data;
  },

  async deleteUser(id) {
    await api.delete(`/users/${id}`);
  }
};

4. Маршруты (router/)

Маршруты, относящиеся к модулю:

// router/users.routes.js
export const usersRoutes = [
  {
    path: '/users',
    component: () => import('../views/UsersPage.vue'),
    meta: { requiresAuth: true },
    children: [
      {
        path: ':id',
        component: () => import('../views/UserDetailPage.vue')
      }
    ]
  }
];

5. Типы (types/)

TypeScript типы для модуля:

// types/user.types.ts
export interface User {
  id: string;
  name: string;
  email: string;
  active: boolean;
  createdAt: Date;
}

export interface CreateUserDTO {
  name: string;
  email: string;
}

Как регистрировать модуль в приложении

Vuex

// store/index.js
import { createStore } from 'vuex';
import usersModule from '@/modules/users/store/users.module';

export default createStore({
  modules: {
    users: usersModule
  }
});

Маршруты

// router/index.js
import { createRouter, createWebHistory } from 'vue-router';
import { usersRoutes } from '@/modules/users/router';

const routes = [
  ...usersRoutes,
  // другие модули
];

export default createRouter({ history: createWebHistory(), routes });

Экспорт модуля

// modules/users/index.js
export { default as usersModule } from './store/users.module';
export { usersRoutes } from './router';
export { userService } from './services/userService';
export * from './types';

Преимущества модульной структуры

  1. Изоляция — компоненты и логика не пересекаются
  2. Переиспользование — модуль можно скопировать в другой проект
  3. Масштабируемость — легко добавлять новые модули
  4. Тестирование — проще тестировать отдельный модуль
  5. Совместная работа — разные разработчики работают в разных модулях

Модуль должен быть полностью независимым и содержать всё необходимое для функционирования фичи.

Что будет внутри отдельного модуля приложения на Vue? | PrepBro