Об этом проекте

Reselect — это библиотека для создания мемоизированных функций-«селекторов». Она часто используется с Redux, но также может применяться с любыми обычными неизменяемыми данными JavaScript. Ключевые характеристики, описанные в README: - Селекторы могут вычислять производные данные, позволяя Redux хранить минимально возможное состояние. - Селекторы эффективны: селектор не пересчитывается, пока не изменится один из его аргументов. - Селекторы компонуемы: их можно использовать как входные данные для других селекторов. Проект ссылается на страницу документации Redux о получении производных данных с помощью селекторов для описания цели, мотивации и типичных сценариев использования, включая использование с React-Redux. Варианты установки: - Redux Toolkit: Reselect уже включён по умолчанию в официальный пакет Redux Toolkit, поэтому дополнительная установка не требуется. Его можно импортировать как `createSelector` из `@reduxjs/toolkit`. - Отдельно: установите пакет `reselect` через npm, Yarn или pnpm. Документация размещена на reselect.js.org и включает введение, объяснение того, как работает Reselect, справочник API для `createSelector`, `createSelectorCreator`, `createStructuredSelector`, проверок только для разработки, `lruMemoize` и `weakMapMemoize`, а также FAQ. Базовое использование: `createSelector` принимает один или несколько входных селекторов, которые извлекают значения из аргументов, и функцию результата, которая получает извлечённые значения и возвращает производное значение. Сгенерированный выходной селектор пересчитывается только тогда, когда извлечённые значения изменяются. В README есть пример, показывающий, что обычный селектор выполняется при каждом вызове, а мемоизированный селектор пропускает пересчёт и возвращает существующую ссылку на результат, когда входные данные не изменились. Отмечается, что стабильность ссылок важна для таких библиотек, как React-Redux и React, которые полагаются на проверки равенства ссылок для оптимизации обновлений UI. В README определяются термины: функция-селектор, входные селекторы, выходной селектор, функция результата и зависимости. Описанные изменения в версии 5.0.0 включают: - Настройка: объект параметров для `createSelectorCreator` с настраиваемыми функциями `memoize` и `argsMemoize` и их параметрами; `createSelector` поддерживает прямую настройку `memoize` и `argsMemoize`. - Мемоизация: новая функция мемоизации по умолчанию `weakMapMemoize`; `memoize` и `argsMemoize` доступны как поля выходного селектора для отладки. - TypeScript: прекращена поддержка версий TypeScript ниже 4.7; улучшена производительность TypeScript при вложении выходных селекторов, при этом предел вложенности увеличен с примерно 8 до примерно 30, что уменьшает ошибки глубокой инстанциации типов. - API: удалена вторая перегрузка `createStructuredSelector` из-за подверженности ошибкам времени выполнения. - Дополнительные возможности: `dependencyRecomputations` и `resetDependencyRecomputations` на полях выходного селектора; инструмент разработки `inputStabilityCheck`, который запускает входные селекторы дважды с одними и теми же аргументами и предупреждает, если результаты различаются; инструмент разработки `identityFunctionCheck`, который проверяет, возвращает ли функция результата собственный вход. - Критические изменения: удалены типы `ParametricSelector` и `OutputParametricSelector`, их функциональность интегрирована в `Selector` и `OutputSelector`. Проект распространяется под лицензией MIT. Изначально он был вдохновлён геттерами в NuclearJS, подписками в re-frame и одним предложением для Redux.