Обновить

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

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации