Entonces, ese es exactamente el problema, es este evento muy grande que está llegando. Ahora, para respaldar mi afirmación, hagamos un cálculo rápido de cómo todo esto se alinea en un lugar central, ¿verdad? Entonces, si ves ese spinner en nuestra demostración que mostramos, ¿verdad? Si quieres que se haga a 60 fotogramas por segundo, eso significa que tendríamos mil milisegundos para renderizar 60 fotogramas, ¿verdad? Esa es la matemática. Y eso significa que tienes 16 milisegundos para que tu JavaScript se ejecute por fotograma.
Ahora, para hablar más realísticamente, los navegadores suelen tomar cuatro o seis milisegundos de este tiempo de 16 milisegundos, que son sus tareas internas, composición, pintura, comprensión de cómo analizar HTML, JavaScript y cosas así. Así que, en términos generales, tu JavaScript en realidad solo tiene de 10 a 12 milisegundos o menos para ejecutarse y renderizar ese fotograma en un tiempo constante y evitar el retraso.
Ahora, intentemos ver este pequeño ejemplo de cómo tu código realmente pasa por el pipeline de un navegador, qué es exactamente lo que va a suceder cuando se ejecute tu JavaScript, cuando se ejecute tu CSS, y cuando todo esté compilado. Entonces, todo esto, si lo ves en un solo fotograma, todo esto tiene que hacerse en 16 milisegundos o menos tiempo. Así que tu navegador tiene que ejecutar JavaScript, tiene que calcular cuáles son los estilos, cuál es el CSS para ello, tiene que renderizar todo el CSS, preparar el DOM, tiene que componer todo y analizar todo y mostrar el resultado final en tu página web. Ahora, a medida que sigues añadiendo más JavaScript, ya sea que, no estamos usando solo JavaScript ahora. Tal vez estamos usando CSS y el motor JS como componentes de estilo, estamos usando tal vez leer nosotros o una biblioteca llamada React. Sin mencionar que React, añadir React puede añadir tiempo a tu ejecución de JavaScript. Pero la intención detrás de este ejemplo es que cuanto más tiempo vaya a tomar tu JavaScript, más tiempo se va a extender para que tu navegador pueda ponerse al día con esto. Porque todo esto tiene que hacerse en 16 milisegundos. Si tu JavaScript está tomando más tiempo, vas a superar ese límite de tiempo de 16 milisegundos. Y como tus fotogramas subsiguientes también tendrán que ponerse al día, tu navegador necesita omitir algunos de los fotogramas intermedios para ponerse al día con la velocidad de ejecución de este JavaScript y también atender a los otros fotogramas que están llegando. Y debido a eso, como mencioné, necesita omitir los fotogramas. Y eso es exactamente lo que es un jank, porque solo ves un spinner que no se mueve, porque tuvo que omitir todos los fotogramas para ponerse al día con la velocidad, ¿verdad? Y ese era exactamente el problema allí.
Ahora, volviendo al problema, que era que había una tarea muy grande que estaba bloqueando tu bucle de eventos, ¿verdad? Ahora, si tuviera que sacar esto de mi bucle de eventos, ¿verdad?, y evitar que no bloqueara, mi problema se resolvería, ¿verdad? Así que las otras tareas más grandes pueden seguir funcionando en un contexto separado, mientras que mi bucle de eventos está todo libre. Así que ninguna tarea más grande está bloqueando mis páginas web, UX o como que no está bloqueando o no está entorpeciendo la experiencia. Y esta es exactamente la ideología de un web worker, ¿verdad? En términos simples, los web workers nos permiten trabajar en paralelo utilizando hilos separados, ¿verdad? Esa es como la analogía más simple. Así que puedes hacer más cantidad de cosas en algún contexto paralelo o hilos paralelos para evitar que tu hilo principal se bloquee, ¿verdad? Y puedes dar todas esas tareas más grandes a tus hilos de worker.
Ahora, si quiero mostrarte cómo funciona todo esto, ¿verdad? Entendamos la pequeña analogía. Hay tu aplicación React que se está ejecutando en un hilo totalmente diferente. Y hay un hilo de worker que es, de nuevo, un contexto totalmente separado. Ahora, lo que sucede es que creamos una instancia de worker utilizando la nueva API de workers. Y el worker que obtenemos, enviamos un mensaje a nuestro hilo de worker, que se hace mediante la API worker.postMessage. Así que le enviamos un mensaje que, hey, hay una tarea grande que necesitas hacer. Y el worker lo recibe porque adjuntamos un eventlistener en el lado del worker, que es self.eventlistener. Así que asegúrate de que los workers no tienen acceso a tu ventana.
Comments