Contenido del curso
Antes de optimizar...
Crítical Rendering Path
- 7

Entendiendo el Critical Rendering Path en Navegadores Web
11:11 min - 8

Optimización de JavaScript para mejorar rendimiento web
Viendo ahora - 9

Priorización de recursos CSS para mejorar rendimiento web
11:50 min - 10

Optimización de Carga de Recursos con Preload, Prefetch y Preconnect
10:36 min - 11

Optimización de Animaciones CSS para Mejorar el Renderizado
02:35 min
CSS
WebFonts
Imágenes, Iconos y SVG
- 15

Optimización de Imágenes para Web: Formatos y Herramientas Efectivas
15:32 min - 16

Optimización de Imágenes para Web: Uso de Tamaños y Formatos Adecuados
05:20 min - 17

Comparación entre WebFonts y SVG: Ventajas y Desventajas
08:58 min - 18

Lazy Loading de Imágenes: Técnicas y Estrategias Efectivas
10:14 min - 19

Carga Adaptativa de Imágenes con Gatsby y Web API
04:12 min
Aplicaciones JavaScript
- 20

Optimización de JavaScript para Producción Web
11:20 min - 21

Análisis y Optimización de Bundles con Webpack
11:25 min - 22

Optimización de Bundles en Proyectos Web con Webpack
17:14 min - 23

Code Splitting con Webpack: Optimización de Bundles en Proyectos Web
06:31 min - 24

Lazy Loading de Videos con JavaScript y Modales
21:44 min - 25

Event Propagation y Filtrado de Eventos en JavaScript
17:24 min - 26

Integración de Librerías en Proyectos JavaScript
14:57 min - 27

Optimización de Carga de Modales con Lazy Loading en Webpack
13:24 min - 28

Renderizado en Cliente vs. Servidor: Diferencias y Funciones
08:44 min - 29

Implementación de Server Side Rendering en NodeJS
19:41 min - 30

Optimización de Sitios con Static Site Generation
15:51 min
Caché
- 31

Funcionamiento de Caché y Redes de Distribución de Contenido (CDN)
05:50 min - 32

Configuración y despliegue de sitios web con Netlify y Github Actions
09:03 min - 33

Automatización de despliegues con Github Actions y Cron en Netlify
09:25 min - 34

Implementación de Caché con Service Workers en JavaScript
14:04 min
Performance Budget
Conclusiones
Optimización de JavaScript para mejorar rendimiento web
Resumen
Cada vez que un navegador procesa una página web, realiza un trabajo intenso de parsing, descarga y ejecución de recursos. Aunque no podemos controlar cómo el navegador ejecuta internamente cada paso, sí podemos ayudarle a hacerlo de forma mucho más eficiente. La clave está en identificar y gestionar los recursos que lo bloquean, especialmente JavaScript y CSS.
¿Por qué JavaScript es un recurso bloqueante para el navegador?
Cuando el navegador encuentra una etiqueta <script> durante el HTML parsing, su comportamiento por defecto es detenerse por completo [01:00]. Esto significa que pausará la construcción del DOM para descargar el archivo JavaScript y ejecutarlo. Solo cuando esa ejecución termine, el navegador retomará el parsing del HTML.
Este comportamiento se conoce como recurso bloqueante: el navegador no puede avanzar hasta que el script se haya descargado y ejecutado. En un proyecto real, esto se traduce en tiempos de carga más largos y una experiencia degradada para el usuario.
¿Qué diferencia hay entre defer y async en la carga de scripts?
Existen dos atributos que modifican el comportamiento por defecto de la etiqueta <script> [01:42]:
- Defer (diferido): le indica al navegador que descargue el script en paralelo al parsing del HTML, pero que no lo ejecute hasta que el parsing haya finalizado por completo.
- Async (asíncrono): también descarga el script en paralelo, pero lo ejecuta inmediatamente al terminar la descarga, interrumpiendo el parsing del HTML en ese momento.
La diferencia fundamental es el momento de ejecución. Con defer, el HTML siempre se procesa primero. Con async, la ejecución puede ocurrir en cualquier punto, dependiendo de cuándo termine la descarga.
html
<!-- Comportamiento bloqueante por defecto --> <script src="bundle.js"></script> <!-- Descarga en paralelo, ejecuta al finalizar el parsing --> <script src="bundle.js" defer></script> <!-- Descarga en paralelo, ejecuta en cuanto se descargue --> <script src="bundle.js" async></script>¿Cómo verificar el bloqueo de scripts con Lighthouse y el profiler?
Para analizar el impacto real, se puede usar Lighthouse en Chrome Dev Tools [03:10]. Dentro de la pestaña Lighthouse, se genera un reporte seleccionando únicamente performance. Lo más relevante no es el puntaje numérico, sino el botón View Trace (ver el trazado), que muestra en detalle qué sucede en la línea de tiempo del navegador.
En el main thread del navegador se puede observar cómo, sin atributos en el script, el HTML parsing queda completamente detenido hasta que JavaScript termina su evaluación [04:28]. El hilo principal no libera el HTML hasta que el script se ha ejecutado por completo.
¿Qué sucede al agregar async a los scripts del proyecto?
Al cambiar las etiquetas <script> para incluir el atributo async, el resultado en el profiler es notablemente diferente [06:00]. El HTML parsing aparece concentrado a la izquierda de la línea de tiempo, y la evaluación de JavaScript ocurre después, hacia la derecha.
Esto significa que:
- El parsing del HTML ya no depende de JavaScript para finalizar.
- El navegador procesa primero el HTML completo.
- JavaScript se evalúa una vez que su descarga termina, sin haber bloqueado la construcción inicial del DOM.
El cambio en las métricas de Lighthouse también refleja esta mejora, con un puntaje de performance más alto [05:50].
¿Cómo aplicar este cambio en tu proyecto?
El ajuste es mínimo pero poderoso. En el archivo HTML del proyecto, basta con agregar async o defer a cada etiqueta <script> [05:15]:
html
<!-- Antes: bloqueante --> <script src="app.js"></script> <script src="vendor.js"></script> <!-- Después: no bloqueante --> <script src="app.js" async></script> <script src="vendor.js" async></script>La recomendación es experimentar con ambos atributos, generar reportes en Lighthouse y comparar los trazados del main thread para entender cuál se adapta mejor a cada caso. Con este ajuste tan simple, le quitamos al navegador un obstáculo importante y le permitimos construir el HTML de forma mucho más rápida y sin bloqueos.
¿Ya probaste cambiar entre async y defer en tu proyecto? Comparte en los comentarios qué diferencias encontraste en el profiler.