- Cambio crítico: Se modificó el comando de build para incluir archivos
.tsy.tsx - Impacto: Esto puede haber cambiado el orden de carga de los componentes y recursos
- Efecto en CLS: Si los componentes ahora se cargan de manera diferente, pueden causar re-renders que desplazan el contenido
- Cambio significativo: React 18 introdujo cambios importantes en el renderizado
- Nuevo comportamiento: React 18 tiene un nuevo algoritmo de renderizado que puede causar cambios en el timing de la hidratación
- Impacto en CLS: Los cambios en el ciclo de vida de los componentes pueden causar layout shifts durante la hidratación
- Estilos dinámicos: El nuevo componente
button.tsxusa estilos en línea que dependen de props - Renderizado condicional: El componente incluye lógica condicional para el contador (
count) - Falta de dimensiones fijas: Los botones pueden cambiar de tamaño según el contenido
@navent-re/utilities: Nueva dependencia que puede incluir estilos o componentes que se cargan asíncronamente- Storybook dependencies: Aunque son de desarrollo, pueden afectar el bundle si no están correctamente configuradas
Basándome en el análisis detallado del PR, he identificado 5 causas principales que pueden haber causado el aumento del CLS en tu sitio web:
Problema crítico: El nuevo componente Button usa estilos en línea que se aplican dinámicamente:
const inlineStyles: React.CSSProperties = {
...(fontSize ? { fontSize } : {}),
...(fontWeight ? { fontWeight } : {}),
...(borderRadius ? { borderRadius } : {}),
...(width ? { width } : {}),
...(height ? { height } : {}),
// ... más estilos dinámicos
};Impacto en CLS:
- Los botones pueden cambiar de tamaño después del renderizado inicial
- Si no se definen dimensiones fijas, causan layout shifts
- Los estilos se aplican después de que el componente se monta
Problema: El componente incluye renderizado condicional que puede cambiar el layout:
{ count && <span className={countClasses()}>{ count }</span> }Impacto en CLS:
- El span del contador se añade/remueve dinámicamente
- Puede cambiar el tamaño del botón después de la carga inicial
- No hay espacio reservado para el contador
Problema: El comando de build ahora incluye archivos .ts y .tsx:
"build": "lerna exec --parallel -- babel --root-mode upward src -d lib --extensions .js,.ts,.tsx"Impacto en CLS:
- Cambio en el orden de carga de componentes
- Posible diferencia en el timing de renderizado
- Los módulos TypeScript pueden cargar de manera diferente
Problema: React 18 introdujo cambios importantes en el renderizado:
"react": "^18.2.0",
"react-dom": "^18.2.0"Impacto en CLS:
- Nuevo algoritmo de renderizado concurrente
- Cambios en el timing de hidratación
- Posibles re-renders durante la hidratación
Problema: Se añadió una nueva dependencia que puede incluir estilos o componentes:
"@navent-re/utilities": "^0.11.2"Impacto en CLS:
- Posible carga asíncrona de recursos
- Estilos adicionales que se aplican después del renderizado inicial
- Definir dimensiones fijas para botones:
.styled-button {
min-width: 120px; // Evitar cambios de tamaño
min-height: 48px; // Altura fija
}- Reservar espacio para el contador:
// Siempre renderizar el span, pero ocultarlo si no hay count
<span className={countClasses()} style={{ display: count ? 'inline' : 'none' }}>
{count || ''}
</span>- Usar CSS en lugar de estilos en línea:
// Mover estilos dinámicos a CSS classes
className={`${buttonClasses(...)} ${getDynamicClasses(props)}`}- Optimizar la carga de CSS Modules
- Implementar lazy loading para componentes pesados
- Revisar el timing de hidratación con React 18
- Medir CLS antes y después de cada cambio
- Usar Chrome DevTools Performance para identificar elementos que causan shifts
- Implementar Core Web Vitals monitoring