Monorepo — организация, при которой несколько пакетов, библиотек, приложений или сервисов хранятся в одном репозитории и, как правило, используют общую инфраструктуру сборки, тестирования и публикации. Multirepo — противоположный подход, где каждый пакет или приложение имеет собственный репозиторий, независимый жизненный цикл и отдельные инструменты автоматизации.
В экосистеме JavaScript и при разработке на Lit оба подхода широко используются, особенно при создании дизайн-систем, наборов веб-компонентов, UI-китов и связанных с ними утилит.
В monorepo репозитории часто встречается следующая организация:
repo/
├─ packages/
│ ├─ button/
│ │ ├─ src/
│ │ └─ package.json
│ ├─ modal/
│ └─ theme/
├─ apps/
│ ├─ demo/
│ └─ docs/
├─ package.json
├─ tsconfig.json
└─ tooling/
Для проектов на Lit это особенно удобно, так как веб-компоненты часто тесно связаны между собой: темы, токены, базовые классы, миксины и вспомогательные утилиты используются повторно. Monorepo позволяет держать эти зависимости синхронизированными и прозрачными.
При multirepo каждый компонент или библиотека имеет собственный репозиторий:
lit-button/
├─ src/
├─ package.json
└─ tsconfig.json
lit-modal/
├─ src/
├─ package.json
└─ tsconfig.json
Каждый репозиторий может развиваться независимо, иметь собственную систему версионирования, CI и релизный процесс. Такой подход часто используется для библиотек, распространяемых как отдельные npm-пакеты.
npm workspaces, pnpm,
yarn).Пример подключения внутреннего пакета:
{
"dependencies": {
"@ui/theme": "workspace:*"
}
}
package.json.npm link
или аналогов.Monorepo чаще использует:
changesets, lerna, nx).Это хорошо сочетается с Lit-компонентами, которые развиваются как единая дизайн-система.
Multirepo предполагает:
Для Lit-проектов это особенно ценно, так как:
Monorepo:
Multirepo:
Lit поощряет композицию: базовые классы, миксины, контроллеры реактивности, стили и темы. В monorepo эти сущности естественно оформляются как отдельные пакеты и используются напрямую.
Пример:
@core/base-element@core/theme-tokens@components/button@components/modalВ multirepo подобная архитектура возможна, но требует постоянной публикации промежуточных версий и строгой дисциплины версионирования.
Monorepo облегчает:
Multirepo требует дублирования или синхронизации конфигураций, что увеличивает риск расхождений.
Monorepo:
Multirepo:
| Критерий | Monorepo | Multirepo |
|---|---|---|
| Общие зависимости | Централизованы | Разрознены |
| Рефакторинг | Проще | Сложнее |
| CI/CD | Общий | Изолированный |
| Масштабируемость | Высокая | Средняя |
| Порог входа | Выше | Ниже |
| Подходит для Lit-дизайн-систем | Да | Ограниченно |
Оба подхода активно применяются в JavaScript-экосистеме и подходят для проектов на Lit. Выбор между monorepo и multirepo определяется степенью связности компонентов, размером команды, требованиями к масштабированию и зрелостью инфраструктуры. В контексте Lit, ориентированного на повторное использование и композицию, monorepo часто становится естественным выбором для крупных и долгоживущих систем.