Сигналы — одна из ключевых экспериментальных возможностей Preact,
предлагающая альтернативную модель реактивности по сравнению с
традиционным useState и useReducer. Сигнал
представляет собой объект с единственным свойством .value,
изменение которого автоматически приводит к обновлению всех зависимых
вычислений и компонентов.
import { signal } from '@preact/signals';
const count = signal(0);
count.value++;
В отличие от хуков, сигналы:
Использование сигнала внутри JSX приводит к подписке компонента на изменения:
function Counter() {
return <span>{count}</span>;
}
Под капотом используется тонкая система отслеживания чтений, что позволяет минимизировать количество обновлений DOM. Это особенно важно для высоконагруженных интерфейсов и сложных графов зависимостей состояния.
Вычисляемые сигналы (computed) позволяют описывать
производные значения, которые автоматически пересчитываются при
изменении зависимостей.
import { computed } from '@preact/signals';
const doubled = computed(() => count.value * 2);
Особенности:
Такая модель близка к функционально-реактивному программированию и хорошо подходит для сложной бизнес-логики.
Для выполнения побочных эффектов при изменении сигналов используется
effect:
import { effect } from '@preact/signals';
effect(() => {
console.log('Текущее значение:', count.value);
});
Эффект автоматически подписывается на все сигналы, которые были прочитаны внутри функции. При изменении любого из них эффект будет выполнен повторно. Очистка ресурсов поддерживается через возврат функции:
effect(() => {
const id = setInterval(() => {
console.log(count.value);
}, 1000);
return () => clearInterval(id);
});
Экспериментальная система рендеринга Preact использует сигналы для частичного обновления виртуального DOM. Компоненты больше не обязательно перерендериваются целиком — обновляются только узлы, напрямую использующие изменённые сигналы.
Ключевые аспекты:
memo,
useCallback, useMemo в большинстве
случаев.Это меняет подход к проектированию компонентов: логика состояния может быть вынесена за пределы компонентов без потери реактивности.
Поддержка серверных компонентов находится в экспериментальной стадии и развивается параллельно с аналогичными возможностями React. Компоненты, выполняемые на сервере:
// server-component.jsx
export async function UserProfile() {
const user = await db.getUser();
return <div>{user.name}</div>;
}
Клиент получает уже подготовленную структуру, а интерактивность добавляется через изолированные клиентские компоненты. Это позволяет значительно сократить размер JavaScript на клиенте и ускорить время до первого отображения.
Preact активно экспериментирует с архитектурой «островов». Статический HTML генерируется на сервере, а гидратации подвергаются только интерактивные участки.
Особенности реализации:
<Island component={InteractiveWidget} />
Такой подход особенно эффективен для контентных сайтов, где интерактивность локализована.
Поддержка Suspense в Preact продолжает развиваться и
включает экспериментальные улучшения:
<Suspense fallback={<Loader />}>
<AsyncComponent />
</Suspense>
В сочетании с серверными компонентами и сигналами
Suspense позволяет выстраивать сложные цепочки загрузки
данных без явного управления состояниями загрузки.
Preact предоставляет экспериментальный API для создания собственных рендереров. Это позволяет использовать Preact как универсальное описание UI, не ограничиваясь DOM.
Примеры областей применения:
Рендерер реализует минимальный набор операций:
Это открывает возможность использовать знакомую компонентную модель в нетипичных окружениях.
Экспериментальные возможности Preact часто служат полигоном для опережающей поддержки новых идей экосистемы Jav * aScript:
Фреймворк сохраняет компактность ядра, вынося экспериментальные функции в отдельные пакеты, что позволяет использовать их выборочно без увеличения базового веса приложения.