Рефакторинг в проектах на Stencil направлен на повышение читаемости, предсказуемости и повторного использования веб-компонентов без изменения их внешнего поведения. В основе лежит компонентная архитектура, строгая типизация через TypeScript и декларативная модель реактивности.
Ключевая особенность Stencil — генерация стандартных Web Components. Это накладывает требования к чистоте API компонентов, стабильности атрибутов и минимизации побочных эффектов.
Основные цели рефакторинга:
Распространённая проблема — чрезмерно разросшиеся компоненты, содержащие логику отображения, состояния, валидации и работы с DOM.
Признаки необходимости декомпозиции:
@State() и
@Watch();render() с вложенными условиями;Стратегия:
@Prop();Пример разбиения:
Компоненты Stencil не предназначены для хранения сложной бизнес-логики. Рефакторинг предполагает вынос такой логики в отдельные модули.
Подходы:
Преимущества:
Компонент в идеале содержит:
Stencil использует реактивную модель на основе @State()
и @Prop(). Ошибки в управлении состоянием часто приводят к
лишним перерендерам.
Типичные проблемы:
@State();Стратегии рефакторинга:
@Watch().Плохая практика:
@State() filteredItems: Item[];
Предпочтительный вариант:
get filteredItems() {
return this.items.filter(...);
}
Stencil предоставляет хуки:
componentWillLoadcomponentDidLoadcomponentWillUpdatecomponentDidUpdatedisconnectedCallbackСо временем компоненты начинают использовать несколько хуков для одной задачи.
Рефакторинг включает:
componentWillLoad;componentWillUpdate при возможности вычислений
в render.Хорошая практика — минимальное количество хуков с чётким назначением каждого.
Публичный API веб-компонента — его props, события и методы,
помеченные @Method().
Причины для рефакторинга API:
Стратегии:
isOpen,
hasError);CustomEvent.detail;Важно сохранять обратную совместимость или проводить рефакторинг в мажорной версии.
Слоты — мощный механизм композиции, но их неправильное использование усложняет поддержку.
Признаки необходимости рефакторинга:
this.el.querySelector('slot');Решения:
<slot>.Пример:
<slot name="header">
<default-header />
</slot>
Метод render() должен оставаться максимально
декларативным.
Антипаттерны:
render;Рефакторинг включает:
Допустимо:
const hasError = this.errorMessage !== '';
Недопустимо:
this.state = computeState();
Stencil использует @Event() для общения между
компонентами.
Проблемы:
Стратегии:
EventEmitter<T>;componentAction).Пример:
@Event() userSelected: EventEmitter<User>;
Рефакторинг под тесты — важная часть поддержки кода.
Подходы:
document;Компоненты с минимальной логикой легче тестируются через
@stencil/core/testing.
Финальный этап рефакторинга:
readonly.Единый стиль компонентов повышает скорость понимания кода и снижает стоимость сопровождения.
В проектах на Stencil рефакторинг не является разовым действием. Архитектура компонентов должна эволюционировать вместе с требованиями, оставаясь простой, предсказуемой и соответствующей стандартам Web Components.