Angular-элементы реализуют подход упаковки компонентов Angular в нативные веб-компоненты (Custom Elements), совместимые с любой экосистемой JavaScript. Такой формат постепенно стал важным мостом между фреймворками, включая React, Vue и библиотеку Atomico, ориентированную на функциональные веб-компоненты.
Angular Elements компилирует компонент Angular в класс, наследующий
HTMLElement, и регистрирует его через
customElements.define. В результате появляется возможность
встраивать компонент в существующее приложение без Angular, передавая
данные через атрибуты и свойства DOM.
import { Injector, NgModule, Component, Input, DoBootstrap } from '@angular/core';
import { createCustomElement } from '@angular/elements';
import { BrowserModule } from '@angular/platform-browser';
@Component({
selector: 'hello-element',
template: `Hello {{name}}`
})
export class HelloElement {
@Input() name = '';
}
@NgModule({
imports: [BrowserModule],
declarations: [HelloElement]
})
export class AppModule implements DoBootstrap {
constructor(private injector: Injector) {}
ngDoBootstrap() {
const element = createCustomElement(HelloElement, { injector: this.injector });
customElements.define('hello-element', element);
}
}
После сборки появляется нативный элемент
<hello-element name="Angular">.
Передача параметров осуществляется двумя способами:
События передаются через кастомные CustomEvent, что
делает интеграцию универсальной для веб-компонентного стека.
Atomico создаёт веб-компоненты через функциональные Hooks-подобные конструкции. Поскольку оба подхода опираются на Custom Elements, совместимость достигается без адаптеров.
import { c, html } from "atomico";
function Wrapper() {
const name = "Atomico";
return html`
<hello-element name=${name}></hello-element>
`;
}
customElements.define("wrapper-element", c(Wrapper));
Во время рендера Atomico воспринимает Angular-элемент как обычный DOM-тег.
CustomEvent, что упрощает подписку в Atomico через
onEvent.Angular добавляет runtime, требующий оптимизации. Основная задача — минимизация размера бандла для изолированного элемента.
ng build --prod для удаления инжекторов и
рефлексииПроизводительность Angular-элементов зависит от объёма Angular runtime. Внутри Angular-контекста рендеринг быстрый, однако в окружении без Angular возникают дополнительные затраты на загрузку и инициализацию.
Atomico ориентирован на минимализм и скорость:
Angular-элементы выигрывают функциональностью инфраструктуры: DI, формы, маршрутизация, сложные компоненты.
Использование Angular Elements оказывается полезным в следующих случаях:
Atomico подходит для тонкого «клея» вокруг таких элементов, обеспечивая гибкую композицию.
Custom Elements не требуют знания Angular. С точки зрения хост-приложения это стандартные DOM-узлы, что упрощает эксплуатацию на стороне дизайна систем и библиотек компонентов.
Angular-элементы раскрывают потенциал Angular как поставщика бизнес-логики и UI, отделённого от внешнего окружения. Atomico, в свою очередь, усиливает область веб-компонентов за счёт лёгкой функциональной модели, что обеспечивает удобный синтез при создании дизайн-систем.
Использование Angular Elements оправдано при наличии уже существующей кодовой базы Angular или необходимости переносимости. Atomico выступает в роли компактного слоя композиции, предоставляя механизм упаковки, стилизации и обработки событий без крупного runtime. Такой подход уменьшает связанность между частями фронтенда и поощряет архитектуру микро-компонентов.