Инициализация юнитов
При работе с effector важно соблюдать ключевое правило - создавать юниты и связи между ними не в рантайме, а статически на уровне модуля, чтобы избежать утечки памяти в вашем приложении.
Чтобы понять, почему это происходит, нужно заглянуть в ядро effector и разобраться, как он устроен. В основе лежит модель графа. Каждый юнит — это узел в графе, каждый узел хранит в себе информацию о состоянии, операциях и связи с зависимыми юнитами. Например в таком коде:
import { combine, createStore } from "effector";
const $store = createStore(0);const $derivedStore = combine($store, (storeVal) => !!storeVal);
При создании $store
мы добавляем новый узел в граф effector’а, который хранит ссылку на стор. Для производного стора тоже создается узел, а также связь с исходным стором, вы можете это проверить если выведите в консоль исходный стор, раскроете свойство graphite.next
- массив ссылок на последующие ноды, найдите там ноду где meta.op
будет combine
и также раскройте у такой ноды next
– это и есть наш производный стор. Так как ссылки на объекты юнитов сохраняются в графе, то GC в Javascript не способен удалить их из памяти. Поэтому, например, если вы создадите юниты или связи между ними внутри React компонента, то у вас при каждом маунте компонента они будут создаваться по новой, а старые юниты все также будут жить и работать.
А что с динамикой?
Конечно команда effector понимает насколько важно динамическое поведение, поэтому сейчас активно ведется разработка динамических моделей, которые следует ожидать в следующем мажорном обновлении!
Документация на английском языке - самая актуальная, поскольку её пишет и обновляет команда effector. Перевод документации на другие языки осуществляется сообществом по мере наличия сил и желания.
Помните, что переведенные статьи могут быть неактуальными, поэтому для получения наиболее точной и актуальной информации рекомендуем использовать оригинальную англоязычную версию документации.