Никакого виртуального DOM. Никаких хуков и сигналов. Обычные JavaScript-классы, компилируемые в хирургические обновления DOM — быстрее Solid, компактнее Svelte.
Gea — это компилируемый реактивный UI-фреймворк для JavaScript, который полностью устраняет виртуальный DOM. Вместо diffing'а на этапе выполнения, плагин Gea для Vite анализирует ваш JSX во время сборки, отслеживает каждый доступ к состоянию и генерирует хирургические DOM-патчи — код, обновляющий только те узлы DOM, которые зависят от изменившегося состояния. Никакой сверки, никаких накладных расходов рантайма.
Создан Армаганом Амкаларом (известным в JavaScript-сообществе как dashersw). Gea — третье поколение его фреймворков. Предыдущие: tartJS (фреймворк, лежавший в основе первого в мире SPA для электронной коммерции) и erste (современная версия для мобильных приложений в Cordova). Версия 1.3.0 вышла в июне 2026 года.
Ключевая идея: JavaScript достаточен. Вам не нужно изучать новые примитивы — просто пишите обычные классы.
Вот полностью рабочий компонент счётчика в Gea:
class Counter extends Component {
count = 0
increment() { this.count++ }
decrement() { this.count-- }
template() {
return (
<div class="counter">
<span>{this.count}</span>
<button click={this.increment}>+</button>
<button click={this.decrement}>-</button>
</div>
)
}
}
Это всё. Состояние — свойство класса. Методы мутируют его напрямую. Шаблон его читает.
this.count++ запускает обновление DOM. Никаких useState,
сигналов или массивов зависимостей. Просто класс JavaScript.
Компилятор отслеживает, что this.count используется внутри JSX-шаблона.
Когда count меняется, генерируется патч, обновляющий только
<span> со значением — не весь компонент и не виртуальное DOM-поддерево.
Для состояния, разделяемого между компонентами, Gea предоставляет Store — базовый
класс с Proxy-обёрткой:
class CounterStore extends Store {
count = 0
increment() { this.count++ }
decrement() { this.count-- }
}
Хранилища работают так же, как локальное состояние компонента: обычные свойства,
обычные методы. Proxy-обёртка перехватывает доступ к свойствам, чтобы компилятор
мог отслеживать зависимости и запускать обновления при изменениях. Массивы
перехватываются на уровне методов — push, splice,
sort и другие мутирующие методы генерируют точные события изменений.
Вычисляемые значения — это обычные JavaScript-геттеры:
class TodoStore extends Store {
items = []
get activeCount() {
return this.items.filter(i => !i.done).length
}
get completedCount() {
return this.items.filter(i => i.done).length
}
}
Компилятор распознаёт геттеры, зависящие от свойств хранилища, и пересчитывает их автоматически при изменении зависимостей. Явная мемоизация не требуется.
Gea также поддерживает функциональные компоненты для простых случаев:
function Greeting({ name }) {
return <h1>Привет, {name}!</h1>
}
Магия — и производительность — исходит от плагина Gea для Vite, работающего на этапе сборки:
textContent, setAttribute или вставку/удаление элементов.
Это фундаментально отличается от подхода виртуального DOM, используемого React и Vue. Вместо перерендера виртуального дерева и сверки с предыдущей версией компилятор Gea генерирует код: "когда свойство X меняется, обнови DOM-узел Y". Никакой сверки и согласования — только прямая DOM-хирургия.
Цифры впечатляют. Рассмотрим два набора данных: hello-world (доказывает, что компилятор может исчезнуть) и реальное todo-приложение (доказывает, что рантайм остаётся лёгким, когда приложение действительно работает).
| Фреймворк | Версия | Raw JS | Brotli JS | vs Gea |
|---|---|---|---|---|
| Gea | 1.3.0 | 214 Б | 121 Б | 1.0x |
| Solid | 1.9.12 | 10 196 Б | 3 601 Б | 29.8x |
| Svelte | 5.55.5 | 23 461 Б | 8 537 Б | 70.6x |
| Vue | 3.5.33 | 58 174 Б | 20 711 Б | 171.2x |
| React 19 | 19.2.5 / React DOM 19.2.5 | 189 717 Б | 50 816 Б | 420.0x |
Измерения из свежих production-сборок Vite 8.0.10, только JavaScript-активы. React, Vue и Svelte использовали эквивалентные минимальные hello-world-компоненты.
| Фреймворк | Версия | Raw JS | Brotli JS | Всего Raw | Всего Brotli |
|---|---|---|---|---|---|
| Gea | 1.3.0 | 15 364 Б | 4 896 Б | 18 075 Б | 5 664 Б |
| Solid | 1.9.12 | 16 181 Б | 5 721 Б | 18 892 Б | 6 485 Б |
| Svelte | 5.55.5 | 38 812 Б | 13 661 Б | 41 523 Б | 14 429 Б |
| Vue | 3.5.33 | 63 676 Б | 22 585 Б | 66 387 Б | 23 411 Б |
| React 19 | 19.2.5 / React DOM 19.2.5 | 192 330 Б | 51 460 Б | 195 041 Б | 52 287 Б |
CSS был идентичен во всех сборках: 2 711 Б raw, 746 Б brotli.
js-framework-benchmark — отраслевой стандарт для измерения производительности UI-фреймворков. Он создаёт таблицу из 1 000 строк, выполняет операции выбора, обновления и перестановки строк, и измеряет время выполнения каждого фреймворка.
| Фреймворк | Счёт | vs Ванильный JS |
|---|---|---|
| Vanilla JS | 1.00 | — |
| Gea 1.3 | 1.02 | +2% |
| Solid 1.9 | 1.10 | +10% |
| Svelte 5 | 1.10 | +10% |
| Vue 3.6 | 1.22 | +22% |
| React 19 | 1.43 | +43% |
Gea набирает 1.02 — в пределах 2% от ручного ванильного JavaScript. Это самый близкий результат, которого добивался какой-либо компилируемый UI-фреймворк.
Встроенные компоненты RouterView и Link с параметрами маршрутов,
wildcard'ами и программной навигацией. Роутер подвергается tree-shaking'у — импорт не
добавляет лишнего веса, когда роутер не используется.
Пакет @geajs/ui предоставляет 35+ доступных UI-примитивов на основе
Zag.js: диалоги, меню, подсказки, аккордеоны,
комбобоксы и другие. Это headless-компоненты — вы стилизуете их своим CSS,
а логика доступности (ARIA-атрибуты, клавиатурная навигация, управление фокусом)
обрабатывается автоматически.
Построенный на опыте erste (предыдущего мобильного фреймворка Амкалара), Gea Mobile предоставляет навигацию в стиле iOS, обработку жестов, свайп назад и мобильные transition'ы для создания веб-приложений с нативным ощущением в оболочке Cordova/Capacitor.
Svelte первым популяризировал подход «скомпилировать лишнее». Однако Svelte всё ещё включает рантайм для реактивности. Gea использует Proxy-хранилища, позволяющие компилятору точнее отслеживать зависимости и устранять практически весь рантайм-код.
createSignal), без виртуального DOMСоздать новый проект на Gea просто:
npm create gea
cd my-gea-app
npm run dev
Скаффолдер создаёт проект на Vite 8.0 с TypeScript, компиляцией JSX и предварительно настроенным плагином Gea.
Gea — genuinely инновационный подход. Компилируемая реактивность демонстрирует результаты, которые казались невозможными год назад. Но, как с любым новым фреймворком, решение зависит от контекста:
Рассмотрите Gea, если:
Оставайтесь на зрелых фреймворках, если:
Для большинства проектов зрелые фреймворки остаются правильным выбором. Но Gea представляет реальный шаг вперёд в том, что возможно с компилируемыми UI-фреймворками, и его подход — устранение накладных расходов через компиляторный анализ — вероятно, повлияет на следующее поколение инструментов, независимо от того, будете ли вы использовать его напрямую.
npm create gea и следуйте инструкциям. Скаффолдер создаёт проект на Vite 8.0 с поддержкой TypeScript, компиляцией JSX и настроенным плагином Gea. На GitHub также доступны официальные примеры: счётчик, список задач, роутинг и серверный рендеринг.Разрабатываю production-приложения на React, Next.js, Node.js и современных JavaScript-фреймворках. Gea, Svelte или Solid — выберу то, что подходит вашему проекту.