Creo que Jake Archibald nos presentó algunas ideas en 2013 que podrían agregar aún más positividad al tema:
https://www.html5rocks.com/en/tutorials/speed/script-loading/
El Santo Grial está descargando un conjunto de scripts de inmediato sin bloquear el renderizado y ejecutarlo lo antes posible en el orden en que se agregaron. Lamentablemente, HTML te odia y no te permitirá hacerlo.
(...)
La respuesta está realmente en la especificación HTML5, aunque está oculta en la parte inferior de la sección de carga de scripts. " El atributo IDL asíncrono controla si el elemento se ejecutará asíncronamente o no. Si se establece el indicador" force-async "del elemento, entonces, al obtener, el atributo IDL asíncrono debe devolver verdadero, y al configurar," force-async " la bandera primero debe estar desarmada ... ".
(...)
Las secuencias de comandos que se crean dinámicamente y se agregan al documento son asíncronas de forma predeterminada , no bloquean el procesamiento y se ejecutan tan pronto como se descargan, lo que significa que podrían salir en el orden incorrecto. Sin embargo, podemos marcarlos explícitamente como no asíncronos:
[
'//other-domain.com/1.js',
'2.js'
].forEach(function(src) {
var script = document.createElement('script');
script.src = src;
script.async = false;
document.head.appendChild(script);
});
Esto le da a nuestros scripts una combinación de comportamiento que no se puede lograr con HTML simple. Al ser explícitamente no asíncrono, los scripts se agregan a una cola de ejecución, la misma cola a la que se agregan en nuestro primer ejemplo de HTML sin formato. Sin embargo, al crearse dinámicamente, se ejecutan fuera del análisis de documentos, por lo que el procesamiento no se bloquea mientras se descargan (no confunda la carga de scripts no asíncronos con XHR de sincronización, que nunca es algo bueno).
La secuencia de comandos anterior se debe incluir en línea en el encabezado de las páginas, poniendo en cola las descargas de secuencias de comandos lo antes posible sin interrumpir el procesamiento progresivo, y se ejecuta tan pronto como sea posible en el orden especificado. "2.js" se puede descargar gratis antes de "1.js", pero no se ejecutará hasta que "1.js" se haya descargado y ejecutado con éxito, o no lo haga. ¡Hurra! descarga asincrónica pero ejecución ordenada !
Aún así, esta podría no ser la forma más rápida de cargar scripts:
(...) Con el ejemplo anterior, el navegador tiene que analizar y ejecutar el script para descubrir qué scripts descargar. Esto oculta sus scripts de los escáneres de precarga. Los navegadores usan estos escáneres para descubrir recursos en las páginas que probablemente visitará a continuación, o descubrir recursos de la página mientras el analizador está bloqueado por otro recurso.
Podemos agregar de nuevo la capacidad de descubrimiento al poner esto en el encabezado del documento:
<link rel="subresource" href="//other-domain.com/1.js">
<link rel="subresource" href="2.js">
Esto le dice al navegador que la página necesita 1.js y 2.js. link [rel = subresource] es similar a link [rel = prefetch], pero con semántica diferente. Desafortunadamente, actualmente solo es compatible con Chrome, y debe declarar qué scripts cargar dos veces, una vez a través de elementos de enlace y otra vez en su script.
Corrección: Originalmente dije que estos fueron recogidos por el escáner de precarga, no son, son recogidos por el analizador regular. Sin embargo, el escáner de precarga podría recogerlos, todavía no lo hace, mientras que las secuencias de comandos incluidas en el código ejecutable nunca se pueden precargar. Gracias a Yoav Weiss que me corrigió en los comentarios.
async
es nuevo (ish), perodefer
ha sido parte de IE desde IE4.defer
se agregó a otros navegadores mucho más recientemente, pero las versiones anteriores de esos navegadores tienden a quedarse mucho menos.