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 ввёл сигналы как новую основу реактивности рядом с прежней системой обнаружения изменений.

ФреймворкСигналПроизводноеОсобенность
Angularsignal()computed()Введён в v16, основа новой реактивности и SignalStore
SolidcreateSignalcreateMemoМелкозернистый рендер без виртуального DOM с 2021
PreactsignalcomputedОтдельный пакет @preact/signals
VuerefcomputedСигналы по сути с релиза 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 — Базовая механика сигнала и автоматического отслеживания зависимостей разобрана в прошлом уроке, здесь идёт сравнение реализаций
Сигналы: сходящаяся парадигма

0

1

Войти