Cómo afectan los microtasks a la renderización del browser
Tiempo estimado de lectura: 4 min
- Los microtasks se ejecutan después de cada macrotask y antes de cualquier repintado, por lo que encadenarlos o hacerlos pesados puede bloquear la renderización.
- Si la microtask queue no se vacía, el navegador pospone Style → Layout → Paint y la UI puede quedarse congelada.
- Estrategias prácticas: troceado (chunking), requestAnimationFrame, Web Workers, APIs de scheduling y medición/ profiling.
- Reglas de equipo: no procesar >10ms en microtasks sin justificar; mover tareas >16ms a chunking o workers.
¿Sabes por qué una cadena de Promise.then() puede dejar tu UI congelada? Porque los microtasks afectan la renderización del browser bloqueándola hasta que su cola se vacíe. Esta no es teoría académica: es la raíz de muchos problemas de jank y malas métricas (INP, LCP) en aplicaciones reales.
En las primeras líneas: cómo afectan los microtasks a la renderización del browser es simple y crítico: los microtasks se ejecutan después de cada macrotask y antes de cualquier repintado, así que si acumulas o encadenas microtasks pesadas, el navegador no tiene oportunidad de renderizar.
Resumen rápido (lectores con prisa)
Qué es: Los microtasks son callbacks que se ejecutan entre macrotasks y antes del siguiente paint.
Cuándo usarlo: Para consistencia inmediata de estado y batching corto.
Por qué importa: Microtasks largos o recursivos bloquean la fase de render y causan jank y malas métricas.
Cómo mitigarlo: Chunking, requestAnimationFrame, Web Workers y scheduling.
Cómo funciona: Event Loop, macrotasks y microtasks
El Event Loop tiene iteraciones claras. En cada iteración:
- Ejecuta un macrotask (ej.: callback de evento,
setTimeout,postMessage). - Vacía la microtask queue por completo (
Promise.then,queueMicrotask,MutationObserver). - Ejecuta las fases de render (Style → Layout → Paint) si procede.
Iteración del Event Loop
Fuente formal: WHATWG Event Loops. Referencia práctica: MDN Event Loop.
Regla que bloquea la renderización
La regla que mata interfaces es evidente: el navegador no entra en la fase 3 hasta que la microtask queue está vacía. Si esa cola se repuebla constantemente, la renderización se pospone indefinidamente.
¿Qué problemas verás en producción?
- Jank visible: cualquier bloque que supere ~16ms arruina 60fps. Si tus microtasks suman más de eso, las animaciones y scroll saltan.
- INP y Core Web Vitals: interacción que no despliega un siguiente paint rápidamente penaliza la UX y el SEO. Verifica en web.dev: INP y web.dev: Vitals.
- “Starvation”: microtasks programando microtasks (recursividad) congelan la pestaña hasta el crash.
Ejemplo mínimo que congela
function loop() {
queueMicrotask(loop);
}
loop();
No hay render hasta que esto pare.
Cuándo usar microtasks (y cuándo no)
Microtasks son útiles y necesarias. No son el enemigo. Úsalas cuando:
- Necesitas consistencia inmediata del estado antes del siguiente repintado.
- Quieres agrupar cambios lógicos antes de un único render (batching de estado).
- Manejas limpieza inmediata tras una operación asíncrona.
Pero evita microtasks para trabajo CPU-intenso o bucles largos. Para esos casos, usa macrotasks o APIs de scheduling.
Estrategias para evitar bloquear el render
Resumen de tácticas prácticas para no secuestrar la renderización.
1. Chunking (troceado)
- Divide trabajo pesado en trozos pequeños y programa cada trozo con macrotasks (
setTimeout(..., 0)) opostMessage. - Ejemplo: procesar arrays grandes en lotes de 100-500 elementos.
2. requestAnimationFrame para código vinculado a la visual
Si actualizas animaciones o layout, sincroniza con requestAnimationFrame para respetar vsync.
3. Web Workers
Mueve cálculo intensivo fuera del hilo principal. Comunicación vía postMessage (macrotask).
Guía: Using web workers
4. APIs de scheduling modernas
- Evita hacks como
setTimeout(fn, 0)a ciegas; usa APIs diseñadas para ceder control:scheduler.yield()y Task Scheduler (aún en evolución). - Artículo de referencia: Scheduler (Chrome).
requestIdleCallbacktambién ayuda para tareas de baja prioridad (con sus limitaciones).
5. Medición y profiling
Usa Chrome DevTools Performance y Lighthouse para identificar long tasks y microtask spikes. El panel de Performance muestra frames dropped y long tasks.
Casos reales: batching vs starvation
Frameworks aplican microtasks con criterio. React 18 usa batching y concurrencia para agrupar commits y evitar renders intermedios (React 18 upgrade guide).
Eso es distinto de encadenar miles de promesas manualmente. Batching intencional reduce trabajo de render; microtasks descontrolados lo empeoran.
Regla práctica para equipos técnicos
- Política en code reviews: no procesar >10ms en microtasks sin justificar.
- Si una operación puede bloquear >16ms, debe ser chunked o movida a worker.
- Documenta dónde y por qué se usa
queueMicrotasko promesas críticas; busca alternativas de scheduling.
Conclusión
Los microtasks son herramientas de precisión: mantienen orden y coherencia, pero son capaces de secuestrar el hilo de renderizado si se usan mal. Entender que “microtasks bloquean render hasta vaciar la cola” es suficiente para empezar a evitar errores graves de UX. Mide, trocea y delega: esa tríada separa interfaces fluidas de las que frustran usuarios.
Lecturas y referencias
- WHATWG Event Loops
- MDN Event Loop
- web.dev: INP
- web.dev: Vitals
- queueMicrotask
- requestAnimationFrame
- Using web workers
- Scheduler (Chrome)
- React 18 upgrade guide
FAQ
- ¿Qué es exactamente una microtask?
- ¿Por qué las microtasks se ejecutan antes del paint?
- ¿Cómo puedo detectar si mis microtasks bloquean el render?
- ¿Es mejor usar setTimeout o queueMicrotask para trocear trabajo?
- ¿Cuándo usar Web Workers en vez de chunking?
- ¿Qué herramientas debo usar para medir microtask spikes?
- ¿Qué políticas de equipo son recomendables sobre microtasks?
¿Qué es exactamente una microtask?
Una microtask es un callback que se encola para ejecutarse inmediatamente después de la ejecución de la macrotask actual y antes del siguiente repintado. Ejemplos: Promise.then, queueMicrotask, MutationObserver.
¿Por qué las microtasks se ejecutan antes del paint?
Por diseño del Event Loop: tras ejecutar una macrotask el navegador vacía la microtask queue para garantizar coherencia de estado antes de recomponer estilos y layout.
¿Cómo puedo detectar si mis microtasks bloquean el render?
Usa Chrome DevTools Performance y Lighthouse. Busca long tasks y picos en la cola de microtasks; si ves trabajos que suman más de ~16ms entre frames, probablemente estés causando jank.
¿Es mejor usar setTimeout o queueMicrotask para trocear trabajo?
Para troceado y ceder control al navegador, las macrotasks (setTimeout, postMessage) son preferibles. queueMicrotask mantiene prioridad y puede seguir bloqueando el render si se abusúa.
¿Cuándo usar Web Workers en vez de chunking?
Usa Web Workers cuando la tarea es CPU-intensiva y no interactúa directamente con el DOM. Chunking es útil para tareas grandes con dependencia de estado en hilo principal.
¿Qué herramientas debo usar para medir microtask spikes?
Chrome DevTools Performance, Lighthouse y panel de Performance para identificar frames dropped, long tasks y microtask activity.
¿Qué políticas de equipo son recomendables sobre microtasks?
Reglas prácticas: no procesar >10ms en microtasks sin justificar; mover operaciones >16ms a chunking o workers; documentar el uso de queueMicrotask y promesas críticas.

Leave a Reply