Stencil vs Angular

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 использует собственный компилятор, который:

  • Оптимизирует рендеринг.
  • Генерирует TypeScript декларации.
  • Позволяет подключать JSX для описания структуры компонентов.

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 ориентирован на полноценные приложения, где критична интеграция компонентов с сервисами, маршрутизацией и состоянием на уровне всего приложения.