Congelan Cualquier NavegadorCrear $100,000$ filas con $10$ celdas cada una instancia $1,000,000$ de nodos DOM, consumiendo más de $1.4\text{ GB}$ de RAM y haciendo que cualquier recálculo de estilos (Recalculate Style / Layout) tarde $> 900\text{ ms}$.
Con Virtualización de Ventana, solo existen en el DOM los nodos estrictamente visibles en el viewport de altura $H_{\text{vp}}$ más un margen de amortiguación $O_{\text{overscan}}$ arriba y abajo:
$i_{\text{start}} = \max\left(0, \; \left\lfloor \frac{\text{scrollTop}}{h_{\text{row}}} \right\rfloor - O_{\text{overscan}}\right)$
$i_{\text{end}} = \min\left(N - 1, \; \left\lceil \frac{\text{scrollTop} + H_{\text{vp}}}{h_{\text{row}}} \right\rceil + O_{\text{overscan}}\right)$
export interface VirtualRange {
startIndex: number;
endIndex: number;
visibleCount: number;
offsetTopPx: number;
totalScrollHeightPx: number;
}export function computeVirtualWindowRange(params: {
totalItems: number;
rowHeightPx: number;
viewportHeightPx: number;
scrollTopPx: number;
overscanCount: number;
}): VirtualRange {
const { totalItems, rowHeightPx, viewportHeightPx, scrollTopPx, overscanCount } = params;
if (totalItems === 0) {
return { startIndex: 0, endIndex: -1, visibleCount: 0, offsetTopPx: 0, totalScrollHeightPx: 0 };
}
const rawStart = Math.floor(scrollTopPx / rowHeightPx);
const rawEnd = Math.ceil((scrollTopPx + viewportHeightPx) / rowHeightPx);
const startIndex = Math.max(0, rawStart - overscanCount);
const endIndex = Math.min(totalItems - 1, rawEnd + overscanCount);
return {
startIndex,
endIndex,
visibleCount: endIndex - startIndex + 1,
offsetTopPx: startIndex * rowHeightPx,
totalScrollHeightPx: totalItems * rowHeightPx
};
}
Arquitectura Off-Main-Thread (OMT): Web Workers Dedicados, OffscreenCanvas y Buffers Transferibles (55 min)
Arquitectura Off-Main-Thread (OMT): Web Workers Dedicados, OffscreenCanvas y Buffers Transferibles
1. El Presupuesto Inmutable de 16.67 Milisegundos por Frame (60 Hz)
En una pantalla de $60\text{ Hz}$ ($16.67\text{ ms/frame}$) o $120\text{ Hz}$ ($8.33\text{ ms/frame}$), el hilo principal del navegador (Main Thread) debe ejecutar eventos de usuario, React Reconciler, cálculo de CSS, Layout y Paint. Si un dashboard financiero recibe $5,000$ órdenes por segundo por WebSocket, parsear el JSON, ordenar las columnas y agregar indicadores técnicos JAMÁS debe ocurrir en el Main Thread:
flowchart LR
WS["WebSocket Binary Stream ( Dentro del Web Worker )"] --> PARSE["Filtro, Ordenamiento y Agregación en Hilo Worker"]
PARSE -->|Transferable Float64Array / Comlink RPC| MAIN["Main Thread (React + Zustand)"]
PARSE -->|OffscreenCanvas WebGL| GPU["Composición Directa a GPU (0ms bloqueo Main Thread)"]
Pipeline de Renderizado del Navegador: CSS Containment (contain: strict), Compositor Layers y Glassmorphism sin Jank (50 min)
Pipeline de Renderizado del Navegador: CSS Containment (contain: strict), Compositor Layers y Glassmorphism sin Jank
1. Layout Thrashing y las Únicas Dos Propiedades Animables en el Hilo Compositor GPU
Modificar top, left, width o height en una animación invalida la geometría de la página disparando Layout (Reflow) $\to$ Paint $\to$ Composite en CPU. En cambio, animar exclusivamente transform: translate3d(...) y opacity salta por completo las fases de Layout y Paint, ejecutándose directamente en el hilo Compositor de la GPU.
2. Aislamiento de Sub-Árboles con contain: layout paint style y content-visibility: auto
Al declarar contain: strict (o contain: content) en cada tarjeta de un grid complejo, le garantizamos matemáticamente al motor Blink/WebKit que ningún cambio interno de esa tarjeta puede alterar las dimensiones ni la posición de ningún elemento exterior, acotando el costo de Reflow de $\mathcal{O}(N_{\text{página}})$ a $\mathcal{O}(1)$.'
Módulo 4: Módulo 4: Accesibilidad Algorítmica WCAG 2.1 AA, Telemetría RUM en SQL y Certificación
Ingeniería de Accesibilidad WCAG 2.1 AA: Ecuación de Contraste de Luminancia Relativa, Roving TabIndex y Focus Traps (50 min)
Ingeniería de Accesibilidad WCAG 2.1 AA: Ecuación de Contraste de Luminancia Relativa, Roving TabIndex y Focus Traps
1. Cumplimiento Matemático de Contraste WCAG 2.1 AA ($4.5:1$ y $3.0:1$)
Para que un sistema de diseño (incluyendo paneles con Glassmorphism sobre fondos oscuros) cumpla el estándar legal WCAG 2.1 Nivel AA (Criterio 1.4.3), la relación de contraste entre la luminancia relativa del texto $L_{\text{text}}$ y la luminancia efectiva del fondo compuesto $L_{\text{bg}}$ debe satisfacer:
$\text{ContrastRatio} = \frac{\max(L_{\text{text}}, L_{\text{bg}}) + 0.05}{\min(L_{\text{text}}, L_{\text{bg}}) + 0.05} \ge \begin{cases} 4.5 & \text{Texto normal } (< 18\text{pt o } < 14\text{pt bold}) \\ 3.0 & \text{Texto grande e iconos interactivos UI} \end{cases}$
2. Navegación por Teclado en Componentes Compuestos: Patrón Roving TabIndex
En una barra de herramientas, árbol de archivos o grilla de datos con $500$ celdas, poner tabIndex={0} en cada celda obliga al usuario de teclado a presionar Tab $500$ veces para cruzar la pantalla. El patrón WAI-ARIA Roving TabIndex mantiene tabIndex={0} en exactamente 1 elemento activo del grupo y tabIndex={-1} en todos los demás, desplazando el foco internamente con las teclas de dirección (ArrowUp, ArrowDown, Home, End) y permitiendo salir del componente completo con un solo Tab.
Laboratorio Práctico SQL: Auditoría Real User Monitoring (RUM) de Core Web Vitals (INP, LCP, CLS) y Re-Renders (60 min)
Laboratorio Práctico SQL: Auditoría Real User Monitoring (RUM) de Core Web Vitals (INP, LCP, CLS) y Re-Renders
Contexto del Laboratorio
Recibes la telemetría de Real User Monitoring (RUM) de la plataforma web en la tabla frontend_rum_telemetry (route_path, session_id, inp_ms, lcp_ms, cls_score, wasted_rerenders_count). Según el estándar oficial de Google Core Web Vitals, una ruta se evalúa en el percentil 75 (p75) de sus sesiones.
Reglas de Negocio a Consultar
Para cada
route_path, calcula:
1.
sessions_count: total de sesiones medidas (
COUNT(*)::INT).
2.
p75_inp_ms: percentil 75 continuo de
inp_ms redondeado a entero (
ROUND(PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY inp_ms))::INT).
3.
p75_lcp_ms: percentil 75 continuo de
lcp_ms redondeado a entero (
ROUND(PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY lcp_ms))::INT).
4.
avg_wasted_rerenders: promedio de
wasted_rerenders_count redondeado a entero (
ROUND(AVG(wasted_rerenders_count))::INT).
5.
cwv_audit_verdict:
-
'FAIL_MAIN_THREAD_BLOCKED_INP' si
p75_inp_ms > 200.
-
'FAIL_SLOW_LCP' si
p75_inp_ms <= 200 pero
p75_lcp_ms > 2500.
-
'PASS_CORE_WEB_VITALS_AA' si ambos están dentro del umbral bueno (
p75_inp_ms <= 200 y
p75_lcp_ms <= 2500).
6. Ordena el resultado por
p75_inp_ms DESC.
Examen de Certificación: Principal High-Density Frontend & React Internals Architect (BACK-601) (45 min)
Examen de Certificación: Principal High-Density Frontend & React Internals Architect (BACK-601)
Certifica tu dominio de nivel Principal sobre el motor concurrente React Fiber, Zustand con selectores atómicos, virtualización de grandes volúmenes de datos, Web Workers Off-Main-Thread y estándares WCAG 2.1 AA.