Monorepo представляет собой подход к управлению несколькими проектами в одном репозитории, что позволяет централизованно управлять зависимостями, инструментами сборки и версионностью. В экосистеме Vue.js использование Monorepo особенно удобно для крупных проектов, состоящих из нескольких библиотек компонентов, приложений и сервисов. Основными инструментами для управления Monorepo являются Lerna и Nx.
Пример базовой структуры Monorepo для Vue.js с Lerna:
my-monorepo/
├── packages/
│ ├── ui-components/ # Общие Vue-компоненты
│ ├── utils/ # Утилиты и хелперы
│ └── app/ # Основное Vue-приложение
├── package.json
├── lerna.json
└── tsconfig.base.json
package.json.Установка и инициализация:
npm install --global lerna
lerna init
lerna.json может выглядеть так:
{
"packages": ["packages/*"],
"version": "independent",
"npmClient": "npm",
"useWorkspaces": true
}
"version": "independent" — каждая библиотека может
иметь собственную версию."useWorkspaces": true — интеграция с Yarn/NPM
workspaces для централизованного управления зависимостями.Добавление пакета в Monorepo:
lerna create ui-components packages/ui-components
Команды для работы с Monorepo:
lerna bootstrap – устанавливает все зависимости между
пакетами.lerna run build – выполняет команду build
во всех пакетах.lerna publish – публикует пакеты в npm с учетом
версий.Nx предоставляет более мощный инструмент для управления Monorepo, включая генерацию приложений и библиотек, продвинутый кэш и CI/CD интеграцию.
Инициализация Nx:
npx create-nx-workspace@latest my-monorepo
При выборе шаблона необходимо указать поддержку Vue.js. Структура Nx отличается от Lerna:
my-monorepo/
├── apps/
│ └── main-app/ # Основное Vue-приложение
├── libs/
│ ├── ui-components/ # Общие компоненты
│ └── utils/ # Утилиты
├── nx.json
├── package.json
└── tsconfig.base.json
Создание новой библиотеки в Nx:
nx generate @nx/vue:lib ui-components
package.json,
тестами и базовым компонентом.import { MyButton } from '@my-monorepo/ui-components';
Lerna и Nx предоставляют команды для сборки и тестирования пакетов:
lerna run build,
lerna run testnx build <project>,
nx test <project>, nx affected:build
(только измененные пакеты)Nx позволяет выполнять сборку и тесты только для измененных пакетов, что значительно ускоряет процесс CI/CD в больших Monorepo.
peerDependencies для Vue и
сопутствующих библиотек, чтобы приложения не включали несколько копий
Vue.nx affected:* позволяет запускать сборку, тесты
и линтер только для измененных проектов.Эта структура и инструменты обеспечивают масштабируемость, удобство поддержки и ускоряют разработку крупных Vue.js проектов в Monorepo.