Recoil: библиотека управления состоянием¶
Recoil — это библиотека с открытым исходным кодом для управления состоянием в приложениях на JavaScript-фреймворке React, разработанная компанией Meta (организация признана экстремистской и запрещена в РФ). Она предоставляет модель графа зависимостей, где состояние определяется через атомы (atoms) и селекторы (selectors), и предназначена для решения задач, связанных с разделением, совместным использованием и производными данными в компонентах React.
¶История
Recoil была представлена публично в апреле 2020 года на конференции React Europe. Её создателем является Дуглас Армстронг (Douglas Armstrong), инженер из команды Facebook (организация признана экстремистской и запрещена в РФ), работавший над внутренними инструментами компании. Основной мотивацией для создания библиотеки стало неудобство использования существующих решений (таких как Redux или Context API) для управления состоянием в крупных приложениях с высокой частотой обновлений, например, в редакторах кода или графических редакторах. Первая стабильная версия 0.0.10 вышла в мае 2020 года. Проект получил статус экспериментального, и его развитие продолжается под эгидой Meta (организация признана экстремистской, деятельность запрещена в РФ), хотя официального релиза версии 1.0 долгое время не происходило. В отличие от многих альтернатив, Recoil не был принят в качестве стандартной библиотеки состояния в экосистеме React, однако сохранил сообщество пользователей благодаря уникальной модели атомов.
¶Основные концепции
¶Атомы (Atoms)
Атом — это единица состояния, которая может быть прочитана и записана компонентами. Атом представляет собой объект, создаваемый функцией atom(), и содержит ключ (уникальный идентификатор) и значение по умолчанию. Компонент, использующий хук useRecoilState(atom), получает текущее значение и функцию для его обновления, аналогично useState, но с возможностью разделения этого состояния между любым количеством компонентов без прокидывания пропсов. Обновление атома приводит к перерисовке только тех компонентов, которые от него зависят.
¶Селекторы (Selectors)
Селектор — это чистая функция, которая вычисляет производное состояние на основе атомов или других селекторов. Он определяется через объект с ключом и функцией get, которая получает доступ к другим фрагментам состояния. Селекторы позволяют создавать вычисляемые данные, которые автоматически обновляются при изменении зависимостей, и поддерживают асинхронные операции (например, запросы к API) через возврат Promise. Запись в селектор возможна через опцию set, что позволяет реализовывать сложные сценарии обновления состояния.
¶Граф зависимостей
Recoil строит направленный ациклический граф зависимостей между атомами и селекторами. Этот граф позволяет библиотеке точно определять, какие компоненты необходимо перерисовать при изменении конкретного фрагмента состояния. Такой подход отличается от подписок в Redux или перерисовки всего дерева в Context API и обеспечивает высокую производительность при работе с большими объёмами данных.
¶Использование в приложении
Для работы Recoil требуется обернуть корневой компонент приложения в компонент <RecoilRoot>, который предоставляет контекст для хранения состояния. Внутри этого корня компоненты могут использовать хуки:
useRecoilState— чтение и запись атома или селектора;useRecoilValue— только чтение;useSetRecoilState— только запись (без подписки на изменения);useResetRecoilState— сброс к значению по умолчанию.
Пример базового использования:
```javascript const textState = atom({ key: 'textState', default: '', });
function TextInput() { const [text, setText] = useRecoilState(textState); return <input value={text} onChange={(e) => setText(e.target.value)} />; } ```
¶Асинхронные запросы
Одной из ключевых особенностей Recoil является встроенная поддержка асинхронных селекторов. Если функция get возвращает Promise, компонент, использующий такой селектор, переходит в состояние загрузки (suspense). Для обработки ошибок предусмотрен механизм Error Boundaries. Это позволяет декларативно описывать зависимости от серверных данных без необходимости использования отдельного стейт-менеджера для запросов.
¶Сравнение с альтернативами
¶Redux
В отличие от Redux, требующего описания действий (actions), редьюсеров и использования паттерна Flux, Recoil предлагает более простую императивную модель. Состояние в Recoil не хранится в едином глобальном объекте, а распределено по атомам, что упрощает код и снижает порог входа. Однако Redux предоставляет более строгие гарантии предсказуемости и мощные инструменты разработки (DevTools), а также не зависит от конкретной версии React.
¶Context API
Context API в React позволяет передавать данные через дерево компонентов без пропсов, но имеет ограничение: при изменении значения контекста перерисовываются все компоненты, использующие этот контекст. Recoil решает проблему точечной подписки на фрагменты состояния, что критично для производительности в крупных приложениях. Контекст также не поддерживает вычисляемые значения без дополнительных библиотек.
¶Zustand и Jotai
Zustand и Jotai — более лёгкие альтернативы, появившиеся примерно в то же время. Jotai использует схожую атомарную модель, но с меньшим размером бандла и без необходимости в корневом провайдере. Zustand предлагает простой API на основе хуков и не требует обёртки приложения. Recoil сохраняет преимущество в виде встроенной асинхронности и селекторов, но уступает конкурентам в скорости разработки и популярности.
¶Критика и ограничения
Recoil подвергается критике за медленное развитие и отсутствие стабильного релиза. С момента анонса проект оставался в статусе экспериментального, что отпугивает компании, требующие гарантий долгосрочной поддержки. Также отмечается недостаточная документация по сравнению с Redux или MobX. Некоторые разработчики указывают на избыточную сложность встроенного механизма асинхронности, который требует обязательного использования Suspense, что не всегда удобно. Дополнительным ограничением является ориентация исключительно на React, в то время как Redux и Zustand могут применяться с другими фреймворками.
¶Применение
Recoil используется в проектах, где требуется детальная настройка производительности и сложные производные состояния. Примеры включают редакторы кода с подсветкой синтаксиса, приложения для рисования, панели мониторинга с большим количеством обновляемых виджетов, а также приложения с совместным редактированием документов в реальном времени. Библиотека также применяется в образовательных целях как пример современного подхода к управлению состоянием в React.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →
