This is a draft of russian talk about Reatom prerequisites and motivation. Lately, I hope, it will be translating to english.
Иследовать и учится нужно нормально, а не как я.
Стейт-менеджер (СТМ) - реактивная база данных.
Модель - описание структурного типа данных и его зависимостей, применимо как к модулю, так и к всему приложению.
Хороший стейт-менеджер - это хорошие модель-менеджер.
-
https://github.com/reduxjs/redux
- Remove "Redux itself is very simple";
- невозможно нормально скейлить - ни в ширину, ни в глубину (из-за проблем с производительностью и отсутствием lazy-loading из коробки);
- разделение модели на редусеры и селекторы теоретически хорошо, т.к. селекторы выступают публичным интерфейсом. Но на практике в сложных моделях, т.к. редусеры не могут зависить друг от друга, а селекторы могут - вся логика модели переносится в селекторы и редусеры выступают излишней прослойкой;
- результат селектора неиспектабелен (девтулзы);
- описывать статическими типами (да и вообще) селекторы не удобно (нужно знать путь к корню);
- по умолчанию селекторы и их мемоизация никак не автоматизируются. Из-за этого некоторые могут инлайнить описание модели в совершенно случайных местах, в виде getState().my.value (это сложно рефакторить);
- селекторы исполняются после обновления стейта и неправильные данные (установленные в редусерах, которые обычно не имеют рантайм контрактов) могут уронить селектор, но данные остануться в сторе - с этим сложно работать (откатывать, например);
- "мидлвары" - спорный паттерн и является чрезмерно гибким и не всегда предсказуемым апи; часть проблем решается, но решения не стандартизированы, что может влечь еще перечень проблем.
-
https://github.com/davidkpiano/xstate
бойлерплейтно, хотя недавно презентовали свой DSL
-
function-tree (executor pattern)
-
https://github.com/mobxjs/mobx
- огромный бандлсайз
- предлагает использовать нестандартизированный синтаксис (декораторы)
- мутабельный стейт сложнее дебажить
- прокси - неявный паттерн, ухудшающий семантику
- сложный под капотом, могут быть сложности при написании собственных структур данных
- проблема рантайм семантики в том что используемыми зависимостями можно безконтрольно играться. Например, использовать их из di, усложняя анализ (ментальный) связей.
-
https://github.com/zerobias/effector
- стейтфулл сторы мешают переиспользовать "модель" и заставляют думать о утечках памяти
- Недекларативное объявление зависимостей и циклические зависимости - это необязательное усложение кода
- Throw in reducer is not cancel computation of other reducers
- Малый вес библиотеки - это не основной приоритет
Отслеживание изменений - это интересный вопрос, ответ на который зависит от предполагаемого API, архитектуры, среды исполнения и ее возможностей (версия ЯП).
В основном есть два подхода: следить за входящими данными и следить за исходящими данными.
Например, Alt.js следит за тем что входит, редакс за тем что исходит
Средства:
- Иммутабельность
- Фундаментальная предсказуемость
- Не большие накладные расходы
- Средство отслеживания изменений
- Proxy
- Cursor
Emulating a 4-Bit Virtual Machine in (TypeScript\JavaScript) (just Types no Script)
Тайпинги под Map с полным выводом типов
В выводе сильно помогают кортежи (Tuple) и, конечно, extends и infer. Мне углубится в HOT помогло изучение исходников библиотеки typescript-tuple
Рекурсия в типах запрещена, но есть хак. Хотя даже с хаком максимальная глубина рекурсии 8.
type AND<T extends any[]> = {
step: ((...args: T) => any) extends ((x: infer X, ...xs: infer Xs) => any)
? Xs extends []
? X
: X & AND<Xs>
: never
end: never
}[T extends [] ? 'end' : 'step']
// https://github.com/Microsoft/TypeScript/issues/29594#issuecomment-507701193Лично у меня компилятор падал при попытке вывести аккумулирующее дерево
- WeakMap плохо полифилятся
- Хранение объектов по строковому ID в хешпаме не гарбаджколектится
- Стейт все равно должен где-то хранится, вопрос будет ли он по дороге собирать ссылки
- Простой и минималистичный апи. Перегрузки VS коллекция методов
- Отсутствие бойлерплейта
- Статические связи
- Jump to defenition
- Вывод статических типов
- Тестирование
- DI
Flux
детерменированность
Перечень антипатернов:
- динамическое создание или изменение модели
- циклические зависимости
- игнорирование exception flow
https://staltz.com/rx-glitches-arent-actually-a-problem.html
Все граф

