Stencil — это современный фреймворк для создания веб-компонентов, ориентированных на высокую производительность и повторное использование. В отличие от Angular, который является полноценным фронтенд-фреймворком с встроенной системой маршрутизации, инъекцией зависимостей и управлением состоянием, Stencil сосредоточен на генерации стандартизированных веб-компонентов, совместимых с любыми библиотеками или фреймворками.
Angular использует двустороннюю привязку данных
(two-way data binding), что позволяет автоматически синхронизировать
модель и представление. Stencil применяет реактивные
свойства через декораторы @Prop(),
@State() и @Event(), обеспечивая контроль над
изменениями данных и обновлением DOM. Такой подход делает компоненты
более изолированными и независимыми.
В Angular компоненты тесно интегрированы с сервисами и модульной структурой приложения. Каждый компонент обычно живёт в рамках модуля, который управляет его зависимостями и жизненным циклом. Stencil предлагает легковесную архитектуру, где компонент может быть полностью автономным:
import { Component, Prop, h } from '@stencil/core';
@Component({
tag: 'my-button',
styleUrl: 'my-button.css',
shadow: true
})
export class MyButton {
@Prop() label: string;
render() {
return <button>{this.label}</button>;
}
}
Использование Shadow DOM позволяет изолировать стили и предотвращает
их конфликт с глобальными CSS, что в Angular достигается через
ViewEncapsulation, но без глубокого Shadow DOM.
Stencil применяет реактивные свойства и события:
@Prop() — передача данных в компонент извне, поддержка
реактивности при изменении.@State() — внутреннее состояние компонента, аналог
useState в React.@Event() — создание пользовательских событий для
коммуникации с родительскими компонентами.В Angular используются @Input(), @Output()
и сервисы для управления состоянием. Stencil не навязывает глобальное
управление состоянием, что делает его более легковесным и гибким для
интеграции с любыми стековыми решениями.
Stencil компилирует компоненты в чистый JavaScript, используя виртуальный DOM только в процессе рендера. Это позволяет:
lazy-loading).Angular, будучи полноценным фреймворком, имеет больший размер бандла и более сложный runtime. Оптимизации возможны через AOT-компиляцию, tree-shaking и lazy-loading модулей, но архитектура приложения остаётся более громоздкой по сравнению с Stencil.
Stencil генерирует стандартизированные веб-компоненты, которые можно использовать в React, Vue, Angular или даже чистом JavaScript. Angular-компоненты не могут быть напрямую использованы вне Angular без специальных адаптеров. Это делает Stencil идеальным инструментом для создания библиотеки UI-компонентов, которые должны быть независимы от конкретного фреймворка.
Stencil использует собственный компилятор, который:
Angular полагается на Angular CLI и строгую модульную структуру, включая маршрутизацию и сервисы. Для новичков Stencil проще для старта с компонентами, а Angular требует понимания архитектуры приложения и жизненного цикла модулей.
Stencil предоставляет методы жизненного цикла, близкие к React:
componentWillLoad() — перед монтированием
компонента.componentDidLoad() — после монтирования.componentShouldUpdate() — контроль обновления при
изменении свойств.componentDidUpdate() — после обновления
компонента.Angular использует ngOnInit, ngOnChanges,
ngAfterViewInit и другие хуки, которые интегрируются с
системой зависимостей и зонами (NgZone), делая контроль
жизненного цикла более тесно связанным с внутренней архитектурой
Angular.
Stencil поддерживает Shadow DOM и scoping стилей через CSS или SCSS,
что обеспечивает изоляцию и предсказуемость стилей.
Angular также позволяет изолировать стили через
ViewEncapsulation, но часто требуется дополнительная
настройка для полного Shadow DOM.
| Фича | Stencil | Angular |
|---|---|---|
| Основная цель | Создание веб-компонентов | Полноценный SPA-фреймворк |
| Архитектура | Легковесная, автономные компоненты | Модульная, тесно интегрированные компоненты |
| Работа с данными | @Prop, @State, @Event | @Input, @Output, сервисы |
| Shadow DOM | Да, изоляция стилей | Частично через ViewEncapsulation |
| Совместимость | Кросс-фреймворк | Только Angular |
| Размер бандла | Минимальный, оптимизированный | Больший, требует оптимизации |
| Жизненный цикл | componentWillLoad, componentDidLoad и др. | ngOnInit, ngAfterViewInit и др. |
| Сборка и компиляция | Встроенный компилятор, генерация чистого JS | Angular CLI, AOT-компиляция |
Stencil идеально подходит для создания библиотек компонентов, где важны независимость, производительность и кросс-фреймворк совместимость. Angular ориентирован на полноценные приложения, где критична интеграция компонентов с сервисами, маршрутизацией и состоянием на уровне всего приложения.