1. Pregunta y contexto
Esta pregunta evalúa el rendimiento frontend y los fundamentos del navegador. Una página maneja entradas de usuario, desplazamiento y animaciones mientras también procesa analíticas, cómputo de baja prioridad o trabajo diferido. Explica qué resuelven los callbacks de inactividad, cómo evitar esperas indefinidas y por qué las confirmaciones del DOM suelen pertenecer a requestAnimationFrame.
2. Qué está evaluando el entrevistador
- Si comprendes que
requestIdleCallbackprograma trabajo de baja prioridad durante los periodos de inactividad del navegador; no se apropia del hilo principal (no es apropiativo). - Si utilizas
IdleDeadline.timeRemaining()para fragmentar tareas y estableces untimeoutcuando el trabajo tiene una fecha límite. - Si reconoces la compatibilidad limitada en navegadores y diseñas la detección de capacidades con una semántica explícita de respaldo (fallback).
- Si separas el cómputo, el envío por red, la mutación del DOM y los tiempos de animación, para luego medir el impacto en la interacción.
La guía de entrevistas frontend de Coursera incluye la optimización del rendimiento, las métricas de producción y las compensaciones como áreas fundamentales de evaluación. MDN describe requestIdleCallback() como trabajo en segundo plano durante periodos de inactividad; su opción timeout puede evitar que el trabajo obligatorio espere demasiado, pero podría perjudicar la interacción. El ejemplo oficial de Chrome separa aún más el cómputo en inactividad de las actualizaciones del DOM en el siguiente fotograma.
3. Preguntas aclaratorias antes de responder
- ¿Se puede retrasar el trabajo? ¿Qué fechas límite aplican a los lotes de analíticas, la precarga y la retroalimentación requerida por el usuario?
- ¿El callback modificará el DOM, actualizará el estado, escribirá en el almacenamiento o solo enviará una solicitud de red?
- ¿Los navegadores objetivo admiten la API? Si no es así, ¿el trabajo debería retrasarse, ejecutarse de inmediato o descartarse?
- ¿Qué métrica se está protegiendo: el retardo de entrada (input delay), las tareas largas (long tasks), la fluidez de las animaciones o la entrega de analíticas?
4. Estructura para una respuesta de 30 segundos
Clasificaría el trabajo como descartable, aplazable u obligatorio. Para cómputos pequeños no críticos o una cola de envíos, usaría requestIdleCallback dentro del presupuesto de timeRemaining() disponible y añadiría un timeout solo cuando exista una fecha límite importante. El callback prepararía los datos en lugar de realizar mutaciones impredecibles en el DOM; el siguiente requestAnimationFrame confirmaría los cambios visibles. Detectaría la disponibilidad de la API, preservaría la semántica de cancelación, expiración y entrega en la alternativa de respaldo, y mediría el retardo de entrada, las tareas largas y la compleción de los objetivos de negocio.
5. Análisis paso a paso a profundidad
Paso 1: Decidir si el trabajo pertenece al tiempo de inactividad
La retroalimentación para el usuario, las animaciones y el renderizado crítico no pueden depender del tiempo de inactividad. El procesamiento por lotes de analíticas, la precarga no crítica, la indexación por fragmentos y la serialización en segundo plano sí pueden esperar. El trabajo que debe terminar antes de una fecha límite necesita un timeout, pero la ruta del timeout puede competir con la interacción; reduce el tamaño del lote o divide el trabajo si ese costo resulta inaceptable.
Paso 2: Fragmentar el trabajo dentro del presupuesto
El callback recibe un deadline. Procesa solo un lote pequeño que quepa en timeRemaining() y encola otro callback cuando quede trabajo pendiente. Utiliza un marcador de deduplicación para que no todos los eventos programen un nuevo callback. Cancela el trabajo encolado ante cambios de ruta, desmontajes o una versión de resultado más reciente, evitando así que resultados obsoletos actualicen la página.
Paso 3: Separar los tiempos de cómputo, red y DOM
Un callback de inactividad puede preparar datos, serializarlos o encolar un envío; la solicitud de red en sí misma no garantiza un presupuesto continuo de inactividad. Las escrituras en el DOM pueden desencadenar cálculos de diseño (layout) y pintura impredecibles, por lo que conviene calcular o construir un fragmento durante el tiempo de inactividad y confirmar los cambios visibles en requestAnimationFrame. Si el cómputo sigue demandando mucha CPU, un Worker aísla el hilo principal de manera más confiable que una división interminable en fragmentos.
Paso 4: Diseñar la compatibilidad y la medición
Detecta la presencia de la API y elige la programación nativa, un temporizador o un canal de mensajes. No afirmes que el respaldo tiene la semántica nativa de inactividad; especifica si retrasa, ejecuta de inmediato o descarta el trabajo opcional. Registra la longitud de la cola, el tiempo de espera, el conteo de timeouts, los aciertos de cancelación, el retardo de entrada y las tareas largas; luego compara los datos de usuarios reales antes y después del cambio.
6. Ejemplo de respuesta de alta calidad
Primero preguntaría si el trabajo afecta la interacción actual y cuándo debe completarse. La analítica, la precarga no crítica y la serialización fragmentable pueden usar requestIdleCallback; la retroalimentación a entradas, las animaciones y el renderizado crítico no pueden esperar al tiempo de inactividad.
Procesaría lotes pequeños hasta que timeRemaining() sea insuficiente. Solo una cola con una fecha límite real de negocio recibe un timeout, y aceptaría que la ruta del timeout puede causar interrupciones visuales (jank). El callback prepara los datos, mientras que requestAnimationFrame confirma los cambios en el DOM. Los desmontajes y las versiones de resultado más recientes cancelan la cola para que el trabajo obsoleto no vuelva a escribir.
Dado que MDN señala que el soporte es limitado, detectaría la disponibilidad de la característica. Sin soporte nativo, retrasaría con un temporizador o un canal de mensajes, o descartaría el trabajo opcional según los requisitos del producto, manteniendo las mismas reglas de expiración. Finalmente, mediría el retardo de entrada, las tareas largas, el tiempo de espera en cola, el conteo de timeouts y la entrega de analíticas para comprobar si la experiencia de usuario mejoró.
7. Errores comunes
- Tratar a un callback de inactividad como un hilo en segundo plano; sigue ejecutándose en el hilo principal, por lo que el código síncrono prolongado bloquea la entrada del usuario.
- Configurar un
timeoutcorto de forma incondicional; el timeout convierte el trabajo de baja prioridad en una ráfaga de competencia contra las interacciones. - Realizar mutaciones grandes en el DOM dentro del callback de inactividad; los costos impredecibles de layout y pintura pueden anular los beneficios.
- Omitir la detección de capacidades y hacer que el soporte limitado de la API sea un requisito indispensable para el funcionamiento correcto.
- Programar una ejecución por evento sin consolidación, deduplicación, cancelación o verificación de versión de resultados.
8. Preguntas de seguimiento y respuestas
Pregunta de seguimiento 1: ¿Puede el callback esperar indefinidamente si no hay tiempo de inactividad?
Sin un timeout, el trabajo requerido puede esperar durante mucho tiempo. Asígnale un timeout al trabajo sujeto a una fecha límite y reduce el tamaño del lote o elige un programador más directo en la ruta del timeout. Permite que el trabajo descartable expire en lugar de sacrificar la respuesta a las entradas del usuario.
Pregunta de seguimiento 2: ¿Por qué no actualizar el DOM dentro de requestIdleCallback?
La mutación del DOM implica costos impredecibles de layout, pintura y composición, y puede exceder el presupuesto de inactividad. Calcula o construye un fragmento durante el tiempo de inactividad, confírmalo en requestAnimationFrame y verifica el resultado mediante mediciones de tareas largas y retardo de entrada.
Pregunta de seguimiento 3: ¿Cuándo se debería usar un Worker?
Usa un Worker cuando un cómputo pesado y sostenido en la CPU continúe ocupando el hilo principal después de fragmentarlo. Los Workers añaden costos de serialización, comunicación y cancelación; para tareas pequeñas y aplazables, un callback de inactividad es más simple.