Инициализация юнитов

При работе с 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. Перевод документации на другие языки осуществляется сообществом по мере наличия сил и желания.

Помните, что переведенные статьи могут быть неактуальными, поэтому для получения наиболее точной и актуальной информации рекомендуем использовать оригинальную англоязычную версию документации.

Соавторы