Комментарии 2
победили утечки памяти
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 получается, если смотреть в рамках одного компонента.

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