Cuando el proyecto crece, el “performance” casi siempre se pierde por mil cortes pequeños: templates demasiado inteligentes, estado duplicado, pipes innecesarios, y efectos colaterales difíciles de rastrear.
El cambio más importante fue mover la complejidad fuera del HTML y hacia un estado explícito con signals: guardamos lo mínimo posible y derivamos el resto con `computed()`.
En los templates, priorizamos control flow moderno (`@for`, `@if`) y `track` estable. Esto evita work extra del renderer y reduce “reflows” cuando el contenido cambia.
Otro punto crítico fue el navbar con scroll-spy: usar `IntersectionObserver` es correcto, pero hay que elegir el “section” dominante (por ratio) y no reaccionar a un único entry aislado.
El resultado es una navegación más consistente: el estado activo se actualiza sin parpadeos y sin depender de hacks en DOM.
Mi regla: menos magia en el template, más estado derivado y determinístico. Eso hace que el UI sea más rápido, pero sobre todo más predecible.