State Management
Сигналы: сходящаяся парадигма
К 2026 году происходит редкое для фронтенда событие: разные команды независимо приходят к одному решению. Solid с самого старта в 2021 строил всё на сигналах. Preact добавил @preact/signals. Vue давно опирался на ref и computed, по сути сигналы под другим именем. Angular в версии 16 ввёл signal() и сделал его центром новой реактивности. Vue готовит компилятор Vapor, который убирает виртуальный DOM и опирается на ту же реактивность. Четыре фреймворка, четыре истории - и почти одинаковый API чтения и записи значения.
- Angular: signal(), computed() и effect() как фундамент реактивности начиная с версии 16
- Solid: createSignal и createMemo, мелкозернистые обновления без виртуального DOM с 2021 года
- Preact: @preact/signals приносит сигналы в экосистему React-совместимого фреймворка
- Vue: ref и computed это сигналы по сути, а компилятор Vapor усиливает их без виртуального DOM
- Кросс-командные обсуждения: общий словарь сигналов упрощает переход между фреймворками
Предварительные знания
- Механика сигнала: контейнер значения, чтение которого регистрирует зависимость
- Производное значение, которое пересчитывается при изменении источников
- Идея автоматического отслеживания зависимостей без ручного массива
Что именно сошлось
Сигнал это контейнер значения с двумя свойствами. Чтение сигнала во время вычисления регистрирует зависимость: система запоминает, кто прочитал значение. Запись нового значения уведомляет всех зависимых, и они пересчитываются. Производное значение (computed, memo) само является сигналом, который читает другие сигналы и обновляется при их изменении. На этой механике сошлись несколько фреймворков.
Синтаксис различается в деталях - вызов функции, пара геттер-сеттер, свойство value - но идея одна. Везде есть источник, производное от него и автоматическая связь без ручного перечисления зависимостей. Эта форма повторяется потому, что решает общую задачу точечного обновления лучше, чем перерисовка всего дерева.
Сама модель не нова: она восходит к реактивным таблицам и библиотекам вроде Knockout (2010) и MobX. Новизна 2020-х в том, что мейнстрим-фреймворки сделали сигналы фундаментом, а не надстройкой, и встроили их в компилятор.
Что общего у сигналов в Angular, Solid и Vue, несмотря на разный синтаксис?
Сигналы в четырёх фреймворках
Каждый фреймворк пришёл к сигналам своим путём. Solid с рождения построил рендеринг на мелкозернистых сигналах без виртуального DOM. Preact добавил отдельный пакет сигналов поверх своей модели. Vue с самого начала опирался на ref и computed, что по сути и есть сигналы, а компилятор Vapor усиливает их. Angular в версии 16 ввёл сигналы как новую основу реактивности рядом с прежней системой обнаружения изменений.
| Фреймворк | Сигнал | Производное | Особенность |
|---|---|---|---|
| Angular | signal() | computed() | Введён в v16, основа новой реактивности и SignalStore |
| Solid | createSignal | createMemo | Мелкозернистый рендер без виртуального DOM с 2021 |
| Preact | signal | computed | Отдельный пакет @preact/signals |
| Vue | ref | computed | Сигналы по сути с релиза Vue 3, компилятор Vapor в разработке |
Связь сигналов и отказа от виртуального DOM не случайна. Виртуальный DOM сравнивает целое дерево, чтобы найти изменения. Сигналы знают точечно, что изменилось, и обновляют ровно нужный узел. Поэтому Solid и Vue Vapor строят рендеринг прямо на сигналах: компилятор связывает сигнал с конкретным местом в DOM, минуя диффинг.
- Виртуальный DOM — При изменении состояния перестраивается дерево, новая версия сравнивается со старой, различия применяются к DOM. Простая модель, но диффинг стоит работы пропорционально размеру дерева
- Сигналы без виртуального DOM — Сигнал напрямую связан с местом в DOM. Изменение источника обновляет ровно этот узел, без сравнения дерева. Мелкозернисто и предсказуемо по стоимости обновления
Сходимость на сигналах облегчает переход между фреймворками: словарь сигнала, производного и эффекта переносится почти без изменений. Команде, знающей сигналы Angular, базовая реактивность Solid или Vue читается с первого взгляда.
Почему сигналы часто идут в паре с отказом от виртуального DOM, как в Solid и Vue Vapor?
Статус предложения TC39 Signals
Раз все сошлись на сигналах, возникает вопрос: не пора ли встроить сигналы прямо в JavaScript? Так появилось предложение TC39 Signals - попытка стандартизировать общий примитив, чтобы фреймворки могли разделять одну реализацию и совместимость. В работе над ним участвуют авторы Angular, Preact, Solid и других проектов.
На 2026 год предложение TC39 Signals всё ещё находится в комитете на стадии обсуждения и не является частью стандарта JavaScript. Это не готовая возможность языка, а черновик. Полагаться на встроенные сигналы в спецификации ECMAScript пока нельзя.
Что это значит на практике. Реактивность по-прежнему обеспечивает фреймворк: signal в Angular, createSignal в Solid, ref в Vue. Стандарт мог бы дать общий низкоуровневый примитив, поверх которого фреймворки строили бы свои API, что упростило бы интероп. Но до завершения процесса TC39 это остаётся ориентиром, а не основой для продакшена.
Сходимость на сигналах это отраслевой тренд в библиотеках и фреймворках, а не свершившийся факт в самом языке. Сигнальная модель уже доминирует в реализациях, при этом её стандартизация в ECMAScript пока остаётся открытым процессом в комитете.
Каков статус предложения TC39 Signals на 2026 год?
Связь с другими темами
Этот урок про сходимость. Конкретные реализации разобраны в уроках о фреймворках:
- Сигналы: базовая механика — Как именно сигнал отслеживает зависимости и пересчитывает производные значения разобрано в прошлом уроке
- NgRx и SignalStore — SignalStore в Angular строит стор поверх сигналов, частный случай этого тренда
Итог
- Сигнал это контейнер значения, чтение которого регистрирует зависимость, а запись уведомляет подписчиков
- Angular, Solid, Preact и Vue сошлись на сигналах независимо, хотя пришли к ним из разных мест
- Общая выгода: мелкозернистые обновления без диффинга всего дерева и автоматическое отслеживание зависимостей
- API почти одинаков: чтение значения, запись значения и производное computed/memo поверх источников
- Тренд усиливают компиляторы без виртуального DOM: Solid с рождения, Vue Vapor в разработке
- Предложение TC39 Signals всё ещё в комитете на стадии обсуждения и не является стандартом JavaScript на 2026 год
Связанные уроки
- sm-10-signals — Базовая механика сигнала и автоматического отслеживания зависимостей разобрана в прошлом уроке, здесь идёт сравнение реализаций