Версионирование компонентов в Lit — это система практик и соглашений, позволяющих управлять изменениями веб-компонентов без разрушения совместимости, обеспечивать предсказуемость обновлений и долгосрочную поддержку библиотек и дизайн-систем.
Компонент в Lit — это изолированный, переиспользуемый элемент, который может применяться в разных проектах, командах и даже организациях. Без чёткой стратегии версионирования любое изменение в компоненте превращается в потенциальный источник ошибок:
Версионирование решает эти проблемы, формализуя жизненный цикл компонента.
В экосистеме JavaScript стандартом является Semantic Versioning (SemVer):
MAJOR.MINOR.PATCH
Применительно к Lit-компонентам:
Пример:
my-button@2.1.3
2 — вторая несовместимая версия API;1 — добавлены новые возможности;3 — исправлены баги.Для корректного версионирования необходимо строго определить, что именно является контрактом компонента.
<my-button>);@property);dispatchEvent);::part).Любое изменение этих элементов потенциально влияет на потребителей компонента.
Наиболее распространённый подход — версионирование на уровне пакета.
@company/ui-button
Версия пакета отражает состояние всех компонентов внутри него.
package.json
└─ version: "1.4.0"
Обновление версии происходит при изменении любого компонента в пакете, что удобно для монорепозиториев и дизайн-систем.
При необходимости независимого развития компонентов используются отдельные пакеты:
@company/button
@company/modal
@company/input
Каждый компонент имеет собственный жизненный цикл и версию, что снижает связность и упрощает обновления.
Изменение версии MAJOR требуется в следующих случаях:
// Было
@property({ type: Boolean }) disabled;
// Стало
@property({ type: String }) disabled;
Такое изменение требует повышения MAJOR-версии.
MINOR-версия повышается, если:
@property({ type: Boolean }) loading = false;
Существующий код продолжает работать без изменений.
PATCH-версия увеличивается, если:
В редких случаях используется версионирование через имя тега:
<my-button-v1></my-button-v1>
<my-button-v2></my-button-v2>
Подход оправдан для крупных библиотек с долгой поддержкой старых версий.
Перед breaking-изменениями рекомендуется вводить стадию устаревания.
updated(changed: Map<string, unknown>) {
if (changed.has('oldProp')) {
console.warn('oldProp устарел и будет удалён в версии 2.0');
}
}
CSS — часть контракта компонента.
::part;Каждая версия должна сопровождаться changelog’ом.
## 2.0.0
- BREAKING: удалено свойство `iconPosition`
- Добавлено событие `toggle`
## 1.5.0
- Добавлено свойство `loading`
## 1.4.2
- Исправлена ошибка рендеринга
Changelog — ключевой инструмент для контроля обновлений.
Корректное версионирование невозможно без тестов.
Любое изменение, ломающие тесты потребителей, должно считаться несовместимым.
В монорепозиториях применяются два подхода:
Все компоненты обновляются синхронно.
Плюсы:
Минусы:
Каждый пакет имеет свою версию.
Плюсы:
Минусы:
Для Lit-проектов часто применяются:
Они позволяют автоматически:
Грамотное версионирование превращает Lit-компоненты в надёжный фундамент интерфейсов:
Версионирование — это не формальность, а архитектурный инструмент, напрямую влияющий на качество и жизнеспособность компонентной системы.