Как сделать модульное приложение на Vue чтобы его разрабатывали две команды

Ответ

Для модульной разработки Vue-приложения двумя командами можно использовать микрофронтенды или монорепозиторий с независимыми модулями.

1. Микрофронтенды (Webpack Module Federation)

Каждая команда разрабатывает свой модуль как отдельное приложение, которое затем интегрируется в хост.

// Конфиг модуля (team1)
new ModuleFederationPlugin({
  name: 'team1',
  filename: 'remoteEntry.js',
  exposes: {
    './Component': './src/components/Team1Component.vue',
  },
});
// Хост-приложение
const Component = () => import('team1/Component');

2. Монорепозиторий (Lerna, Nx, pnpm workspaces)

  • Каждая команда работает в своей папке (packages/team1, packages/team2).
  • Общие зависимости выносятся в корень.
  • Сборка через общий конфиг или отдельные настройки.

3. Динамические импорты + API-контракты

  • Модули грузятся асинхронно (() => import('@module/team1')).
  • Четкие интерфейсы для взаимодействия (TypeScript, документация).

Плюсы:

  • Независимый деплой.
  • Минимизация конфликтов.

Минусы:

  • Сложность настройки (особенно для микрофронтендов).
  • Нужна дисциплина в соблюдении контрактов.

Ответ 18+ 🔞

Смотри, тут такая хуйня: чтобы две команды не перепихивались локтями в одном Vue-приложении, есть пара годных вариантов. Выбирай, что по душе.

1. Микрофронтенды (это когда Module Federation от Webpack)

Каждая команда делает свою хрень как отдельное приложение, а потом это всё стыкуется в одно целое, как конструктор. Выглядит это примерно так:

// Конфиг команды №1 (пусть они делают, например, каталог)
new ModuleFederationPlugin({
  name: 'team1',
  filename: 'remoteEntry.js',
  exposes: {
    './Component': './src/components/Team1Component.vue', // Вот их компонент
  },
});

А главное приложение (хост) это подтягивает:

const Component = () => import('team1/Component'); // И всё, работает!

2. Монорепозиторий (Lerna, Nx или pnpm workspaces)

Тут проще: заводишь одну общую папку, а внутри — отдельные квартиры для каждой команды (packages/team1, packages/team2). Всё общее (типа Vue, Webpack) выносишь наверх, чтобы не дублировать. Сборка может быть общей, а может у каждой команды своя — как договоритесь.

3. Динамические импорты + чёткие договорённости

Тут всё на честном слове: модули грузятся асинхронно (() => import('@module/team1')), но главное — прописать на бумаге (лучше в TypeScript), кто что предоставляет и как с этим работать. Без этого — пиздец и хаос.

Что хорошо:

  • Каждая команда может выкатывать своё без оглядки на других.
  • Меньше шансов, что кто-то случайно сломает чужой код.

Что не очень:

  • Настроить эту махину, особенно микрофронтенды, — та ещё головная боль.
  • Нужна железная дисциплина, чтобы не отходить от договорённостей, а то будет "ой, а мы думали, вы так не сделаете".