Комментарии 5
победили утечки памяти
export type EffectCb = (() => void) & {
status: "active" | "inactive";
children?: Set<EffectCb>;
parent?: WeakRef<EffectCb>;
cleanupSet?: Set<() => void>;
component?: WeakRef<HTMLElement>;
destroy?: () => void;
};Слишком дорогой ценой.
1) WeakRef дороги сами по себе
2) WeakRef немного тормозят GC
3) WeakRef немного тормозят event loop
Кроме того:
дочерний добавляется в
childrenродителя, а ссылка на родителя хранится черезWeakRef
Тут children просто Set, а не WeakSet, наличие в нем ссылки на EffectCb препятствует очистки WeakRef содержащее этот же EffectCb, а значит сама упаковка в WeakRef не имеет смысла.
Куда проще и дешевле была бы реализация через back-pointer.
Тут children просто Set, а не WeakSet, наличие в нем ссылки на EffectCb препятствует очистки WeakRef содержащее этот же EffectCb, а значит сама упаковка в WeakRef не имеет смысла.
Согласен, но это и не так важно, потому что WeakRef здесь больше как подстраховка, а не основной способ борьбы с утечками.
Основная суть в том, что всё это привязывается к компонентам и удаляется вместе с ними.
1) WeakRef дороги сами по себе
2) WeakRef немного тормозят GC
3) WeakRef немного тормозят event loop
Да, но пользы значительно больше, чем незначительное влияние на производительность. И там не так много WeakRef получается, если смотреть в рамках одного компонента.
WeakRef здесь больше как подстраховка
Какой-то странный способ программировать. Вы или понимаете что код делает, или нет. Какая может быть подстраховка, если ясно что ссылку на объект держит Set, и пока он держит GC этот объект не очистит?
чем незначительное влияние на производительность
Очень даже значительное.
Какая может быть подстраховка, если ясно что ссылку на объект держит Set, и пока он держит GC этот объект не очистит?
Чистит, когда разрушается компонент. Вызывается destroy для каждого эффекта. И после разрушения компонента уже никто не держит ссылку на эти эффекты.
А WeakRef на parent больше нужен, чтобы случайно не обратиться к эффекту, который был удален (есть такие ситуации в коде)
Очень даже значительное
Наверное, стоит уточнить, что наши пользователи не заметили изменения в производительности.
Наверное, для ваших пользователей эти изменения были бы очень даже значительные, тут не буду спорить.
---------------------------------
Не пытайтесь найти там идеальное решение, его там точно нет)
Можно было бы сделать лучше?! Конечно.
Текущее решение мы посчитали наиболее подходящим для нас и наших пользователей.
Возможно, в будущем мы сделаем рефакторинг текущего решения и найдём что-то лучше.
не туда ответил изначально

Как мы победили утечки памяти в реактивных веб-компонентах (RWC)