Atomico — это современная библиотека для создания веб-компонентов на базе стандартов Web Components с реактивным подходом, напоминающим фреймворки вроде React или Vue, но с упором на лёгкость, нативность и модульность. Основные отличия становятся особенно заметны при сравнении с популярными альтернативами.
Atomico использует реактивные сигналы, которые
позволяют компонентам автоматически обновляться при изменении данных.
Сигналы функционируют аналогично useState в React, но без
необходимости перерендеривания всего дерева компонентов:
import { component, useState } from "atomico";
function Counter() {
const [count, setCount] = useState(0);
return (
<host>
<button oncl ick={() => setCount(count + 1)}>
{count}
</button>
</host>
);
}
Counter = component(Counter);
Сравнение с React и Vue:
Atomico применяет концепцию <host> для корневого
узла компонента, обеспечивая строгую привязку к Web Components. Это
позволяет избегать лишних обёрток и гарантирует полную совместимость со
стандартом:
import { html, component } from "atomico";
function MyComponent() {
return html`
<host>
<p>Прямой доступ к shadow DOM и событиям</p>
</host>
`;
}
MyComponent = component(MyComponent);
Сравнение с другими фреймворками:
В Atomico свойства компонента автоматически синхронизируются с атрибутами HTML. Это обеспечивает нативную интеграцию с DOM и позволяет использовать компоненты как обычные HTML-теги:
function Button({ label = "Нажми" }) {
return html`<host><button>${label}</button></host>`;
}
Button.props = {
label: String
};
Button = component(Button);
Сравнение с LitElement и Stencil:
@property.@Prop().Atomico поддерживает события с каптуром и bubbling, что делает взаимодействие компонентов предсказуемым и полностью совместимым с DOM API:
function Child() {
const handleClick = () => dispatch("childClick", { detail: 42 });
return html`<host><button oncl ick=${handleClick}>Click</button></host>`;
}
Преимущества перед React и Vue:
$emit, что
требует явного объявления.Atomico изначально проектировался с учётом TypeScript. Все свойства, события и слоты могут быть типизированы, что снижает количество ошибок и улучшает автокомплешн в редакторах:
interface Props {
label: string;
}
function Button({ label }: Props) {
return html`<host><button>${label}</button></host>`;
}
Сравнение с React и Vue:
Atomico создаёт минимальный runtime, ориентированный на Web Components. Это снижает общий размер бандла по сравнению с React или Vue:
| Библиотека | Размер (gzipped) | Подход к рендерингу |
|---|---|---|
| Atomico | ~3 KB | Нативный DOM + сигналы |
| React | ~40 KB | Virtual DOM |
| Vue | ~33 KB | Virtual DOM |
| LitElement | ~5 KB | Шаблонный рендеринг |
Atomico легко интегрируется с любыми веб-стандартами: CSS Custom Properties, Shadow DOM, HTML-слоты, что обеспечивает бесшовную работу в микрофронтендах. В отличие от некоторых фреймворков, компоненты Atomico не зависят от глобального контекста или сложных библиотек.
Ключевые выводы по сравнению с другими решениями: