Gea Framework: компилируемый реактивный UI без Virtual DOM
Технический обзор · Июль 2026

Gea: компилируемый
реактивный UI-фреймворк

Никакого виртуального DOM. Никаких хуков и сигналов. Обычные JavaScript-классы, компилируемые в хирургические обновления DOM — быстрее Solid, компактнее Svelte.

Олег Максимов 3 июля 2026 15 мин чтения

Что такое Gea?

Gea — это компилируемый реактивный UI-фреймворк для JavaScript, который полностью устраняет виртуальный DOM. Вместо diffing'а на этапе выполнения, плагин Gea для Vite анализирует ваш JSX во время сборки, отслеживает каждый доступ к состоянию и генерирует хирургические DOM-патчи — код, обновляющий только те узлы DOM, которые зависят от изменившегося состояния. Никакой сверки, никаких накладных расходов рантайма.

Создан Армаганом Амкаларом (известным в JavaScript-сообществе как dashersw). Gea — третье поколение его фреймворков. Предыдущие: tartJS (фреймворк, лежавший в основе первого в мире SPA для электронной коммерции) и erste (современная версия для мобильных приложений в Cordova). Версия 1.3.0 вышла в июне 2026 года.

Ключевые особенности

Написание компонентов в Gea

Ключевая идея: 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-поддерево.

Общее состояние через Store

Для состояния, разделяемого между компонентами, 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, работающего на этапе сборки:

  1. Анализ JSX: Плагин парсит каждый JSX-шаблон и определяет все выражения, ссылающиеся на свойства компонента или хранилища.
  2. Граф зависимостей: Для каждого выражения компилятор строит граф зависимостей, отображающий узлы DOM на источники состояния.
  3. Генерация патчей: На этапе сборки компилятор генерирует JavaScript, напрямую обновляющий узлы DOM при изменении их зависимостей — через textContent, setAttribute или вставку/удаление элементов.
  4. Устранение рантайма: В hello-world сборке рантайм фреймворка полностью исчезает из бандла. Каждая манипуляция с DOM — прямая.

Это фундаментально отличается от подхода виртуального DOM, используемого React и Vue. Вместо перерендера виртуального дерева и сверки с предыдущей версией компилятор Gea генерирует код: "когда свойство X меняется, обнови DOM-узел Y". Никакой сверки и согласования — только прямая DOM-хирургия.

Бенчмарки: как Gea выглядит на фоне других

Цифры впечатляют. Рассмотрим два набора данных: hello-world (доказывает, что компилятор может исчезнуть) и реальное todo-приложение (доказывает, что рантайм остаётся лёгким, когда приложение действительно работает).

Размер hello-world

Фреймворк Версия 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-компоненты.

Todo-приложение (интерактивное)

Фреймворк Версия 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

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'у — импорт не добавляет лишнего веса, когда роутер не используется.

Gea UI — доступные компоненты

Пакет @geajs/ui предоставляет 35+ доступных UI-примитивов на основе Zag.js: диалоги, меню, подсказки, аккордеоны, комбобоксы и другие. Это headless-компоненты — вы стилизуете их своим CSS, а логика доступности (ARIA-атрибуты, клавиатурная навигация, управление фокусом) обрабатывается автоматически.

Gea Mobile

Построенный на опыте erste (предыдущего мобильного фреймворка Амкалара), Gea Mobile предоставляет навигацию в стиле iOS, обработку жестов, свайп назад и мобильные transition'ы для создания веб-приложений с нативным ощущением в оболочке Cordova/Capacitor.

Gea vs Svelte vs Solid: ландшафт компилируемых фреймворков

Gea vs Svelte

Svelte первым популяризировал подход «скомпилировать лишнее». Однако Svelte всё ещё включает рантайм для реактивности. Gea использует Proxy-хранилища, позволяющие компилятору точнее отслеживать зависимости и устранять практически весь рантайм-код.

Gea vs Solid

Как начать

Создать новый проект на Gea просто:

npm create gea
cd my-gea-app
npm run dev

Скаффолдер создаёт проект на Vite 8.0 с TypeScript, компиляцией JSX и предварительно настроенным плагином Gea.

Стоит ли использовать Gea?

Gea — genuinely инновационный подход. Компилируемая реактивность демонстрирует результаты, которые казались невозможными год назад. Но, как с любым новым фреймворком, решение зависит от контекста:

Рассмотрите Gea, если:

Оставайтесь на зрелых фреймворках, если:

Для большинства проектов зрелые фреймворки остаются правильным выбором. Но Gea представляет реальный шаг вперёд в том, что возможно с компилируемыми UI-фреймворками, и его подход — устранение накладных расходов через компиляторный анализ — вероятно, повлияет на следующее поколение инструментов, независимо от того, будете ли вы использовать его напрямую.

Часто задаваемые вопросы

Что такое Gea framework?
Gea — это компилируемый реактивный JavaScript UI-фреймворк, созданный Армаганом Амкаларом (dashersw). В отличие от React или Vue, Gea полностью устраняет виртуальный DOM — он компилирует JSX в хирургические DOM-патчи на этапе сборки. Состояние управляется через Proxy-обёртки над обычными JavaScript классами. Версия 1.3.0 вышла в июне 2026 года.
Чем Gea отличается от Svelte?
Оба фреймворка используют компиляцию для устранения накладных расходов рантайма, но Gea идёт дальше. Svelte компилирует компоненты, но всё ещё включает небольшой рантайм для реактивности. Компилятор Gea может полностью исключить фреймворк из бандла hello-world — 121 байт против 8.5 КБ у Svelte. Gea также использует сквозную компилируемую реактивность: компилятор отслеживает каждый доступ к состоянию в JSX и генерирует целевой код обновления DOM для каждой зависимости. Последние обновления SvelteKit, включая декларации {const ...} и превью SvelteKit 3, смотрите в моём обзоре Svelte за июль 2026.
Насколько Gea быстрее других фреймворков?
Gea набирает 1.02 в тесте js-framework-benchmark — в пределах 2% от ручного ванильного JavaScript (1.00). Это опережает Solid (1.10), Svelte (1.10), Vue (1.22) и React (1.43). По размеру бандла hello-world приложение на Gea весит 121 байт brotli — в 30 раз меньше Solid (3.6 КБ), в 70 раз меньше Svelte (8.5 КБ), в 171 раз меньше Vue (20.7 КБ) и в 420 раз меньше React (50.8 КБ).
Использует ли Gea хуки или сигналы?
Нет. В Gea нет хуков, сигналов, массивов зависимостей или специальных примитивов. Компоненты — это обычные JavaScript классы или функции. Состояние — свойство класса, которое мутируется напрямую через this.count++. Хранилища — Proxy-обёрнутые классы, где геттеры служат вычисляемыми значениями. Реактивность возникает из анализа JSX компилятором на этапе сборки, а не из рантайм-примитивов.
Готов ли Gea к продакшену?
Gea v1.3.0 — стабильный релиз с 374 коммитами, активной разработкой и 90 тегами. Фреймворк включает встроенный клиентский роутер, 35+ доступных UI-компонентов (на основе Zag.js), мобильные примитивы, поддержку HMR и плагин для Vite 8.0. Распространяется под лицензией MIT. Для продакшен-использования оцените зрелость экосистемы и размер сообщества по сравнению со зрелыми фреймворками.
Как начать проект на Gea?
Запустите npm create gea и следуйте инструкциям. Скаффолдер создаёт проект на Vite 8.0 с поддержкой TypeScript, компиляцией JSX и настроенным плагином Gea. На GitHub также доступны официальные примеры: счётчик, список задач, роутинг и серверный рендеринг.
Поддерживает ли Gea TypeScript?
Да. Gea имеет полноценную поддержку TypeScript. Компоненты и хранилища можно писать с полными аннотациями типов. Плагин для Vite обрабатывает компиляцию JSX и проверку типов через стандартный инструментарий TypeScript.
Контакты

Работаете над веб-проектом?

Разрабатываю production-приложения на React, Next.js, Node.js и современных JavaScript-фреймворках. Gea, Svelte или Solid — выберу то, что подходит вашему проекту.