Volver a la wiki

Performance Guidelines - CreaRack Pro

Performance Guidelines - CreaRack Pro

Última actualización: 26-01-2026 Mejora conseguida: Lighthouse 88 → 92 (+4 puntos)

Este documento establece las buenas prácticas de rendimiento para el desarrollo frontend de CreaRack Pro.


1. Carga de Scripts

Regla General: Usar defer para scripts no críticos

<!-- CORRECTO: Script con defer -->
<script src="{% static 'js/konva.min.js' %}" defer></script>

<!-- INCORRECTO: Script bloqueante -->
<script src="{% static 'js/konva.min.js' %}"></script>

Scripts que DEBEN usar defer

ScriptRazón
konva.min.js171KB - Mayor ahorro (~627ms)
xterm.js283KB - Solo se usa en terminal SSH
socket.io.min.js46KB - Solo para conexiones WebSocket
session_timeout.jsNo crítico para render inicial
dashboard_widgets.jsNo crítico para render inicial
network_status.jsNo crítico para render inicial
script_manager.jsNo crítico para render inicial
auth.jsNo crítico para render inicial

Scripts que NO deben usar defer


2. Carga de CSS

Regla: CSS no crítico debe cargarse de forma asíncrona

<!-- CORRECTO: CSS async con fallback -->
<link rel="preload" href="styles.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
<noscript><link rel="stylesheet" href="styles.css"></noscript>

<!-- INCORRECTO: CSS bloqueante -->
<link rel="stylesheet" href="styles.css">

CSS que debe ser async

CSSRazón
fontawesome/all.min.css89KB, 99% no usado en render inicial
xterm.cssSolo se usa cuando se abre terminal

CSS que debe ser síncrono (crítico)


3. Google Fonts

Regla: Siempre usar preconnect antes de cargar fuentes

<!-- CORRECTO: Preconnect antes de cargar -->
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=..." rel="stylesheet">

<!-- INCORRECTO: Sin preconnect -->
<link href="https://fonts.googleapis.com/css2?family=..." rel="stylesheet">

Ahorro estimado: ~50-100ms en conexión inicial


4. Propiedades CSS a Evitar

backdrop-filter: blur()

NUNCA usar en elementos que contengan inputs interactivos.

/* PROHIBIDO en modales con inputs */
.modal-overlay {
    backdrop-filter: blur(2px); /* CAUSA 1.5s de latencia en inputs */
}

/* CORRECTO */
.modal-overlay {
    background: rgba(0, 0, 0, 0.75); /* Usar opacidad en su lugar */
}

transition en inputs

Evitar transiciones en campos de formulario.

/* EVITAR */
input {
    transition: border-color 0.2s; /* Añade latencia perceptible */
}

/* MEJOR */
input {
    /* Sin transición - respuesta inmediata */
}

5. JavaScript - Debounce y Throttle

Auto-save debe usar debounce

// CORRECTO: Debounce antes de procesar
let autoSaveTimer = null;
const AUTO_SAVE_DEBOUNCE_MS = 500;

export function triggerAutoSave() {
    if (autoSaveTimer) clearTimeout(autoSaveTimer);
    autoSaveTimer = setTimeout(() => {
        saveRackState();
        autoSaveTimer = null;
    }, AUTO_SAVE_DEBOUNCE_MS);
}

// INCORRECTO: Guardar en cada cambio
export function triggerAutoSave() {
    saveRackState(); // Ejecuta en cada keystroke
}

Event listeners de actividad deben usar throttle

// CORRECTO: Throttle para eventos frecuentes
handleActivity() {
    const now = Date.now();
    if (now - this.lastActivity > this.throttleMs) {
        this.lastActivity = now;
        this.resetTimeout();
    }
}

// INCORRECTO: Procesar cada evento
handleActivity() {
    this.resetTimeout(); // Ejecuta en cada mousemove/keydown
}

6. Event Delegation

Usar delegación en lugar de listeners individuales

// CORRECTO: Un listener en el contenedor
const modalContent = modal.querySelector('.modal-content');
if (modalContent) {
    const stopProp = (e) => e.stopPropagation();
    ['keydown', 'keypress', 'keyup', 'input'].forEach(evtType => {
        modalContent.addEventListener(evtType, stopProp, true);
    });
}

// INCORRECTO: Listener en cada input
modal.querySelectorAll('input').forEach(input => {
    input.addEventListener('keydown', stopProp);
    input.addEventListener('keypress', stopProp);
    // ... repetido para cada evento
});

7. Checklist para Nuevos Templates

Al crear un nuevo template HTML:


8. Métricas Objetivo (Lighthouse)

MétricaObjetivoActual
Performance> 9092
FCP< 1.5s~0.7s
LCP< 2.5s~1.8s
TBT< 200ms0ms
CLS< 0.10.005

9. Historial de Optimizaciones

Sesión 26-01-2026

Problema: Latencia de 1.5s al escribir en modales + Score Lighthouse 88

Soluciones aplicadas:

  1. Eliminado backdrop-filter: blur(2px) de .modal-overlay
  2. Eliminado transition: border-color 0.2s de inputs
  3. Añadido throttle a SessionTimeoutManager (5s)
  4. Añadido debounce a triggerAutoSave() (500ms)
  5. Event delegation en modales de ui_panels.js
  6. defer en 10+ scripts (konva, xterm, socket.io, etc.)
  7. CSS async para FontAwesome y xterm.css
  8. Preconnect para Google Fonts

Resultado:


Referencias

Véase también

Subir