Penso che Jake Archibald ci abbia presentato alcuni approfondimenti nel 2013 che potrebbero aggiungere ancora più positività all'argomento:
https://www.html5rocks.com/en/tutorials/speed/script-loading/
Il Santo Graal sta scaricando immediatamente una serie di script senza bloccare il rendering ed eseguirlo il prima possibile nell'ordine in cui sono stati aggiunti. Purtroppo HTML ti odia e non ti consente di farlo.
(...)
La risposta è in realtà nelle specifiche HTML5, sebbene sia nascosta nella parte inferiore della sezione di caricamento degli script. " L'attributo IDL asincrono controlla se l'elemento verrà eseguito in modo asincrono o meno. Se è impostato il flag" force-async "dell'elemento, quindi, al momento di ottenere, l'attributo IDL asincrono deve restituire true e, al momento dell'impostazione, il" force-async " la bandiera deve prima essere disinserita ... ".
(...)
Gli script creati dinamicamente e aggiunti al documento sono asincroni per impostazione predefinita , non bloccano il rendering e si eseguono non appena vengono scaricati, il che significa che potrebbero uscire nell'ordine sbagliato. Tuttavia, possiamo contrassegnarli esplicitamente come non asincroni:
[
'//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);
});
Questo dà ai nostri script un mix di comportamenti che non possono essere raggiunti con un semplice HTML. Essendo esplicitamente non asincroni, gli script vengono aggiunti a una coda di esecuzione, la stessa coda a cui vengono aggiunti nel nostro primo esempio in HTML semplice. Tuttavia, essendo creati dinamicamente, vengono eseguiti al di fuori dell'analisi del documento, quindi il rendering non viene bloccato durante il download (non confondere il caricamento di script non asincroni con la sincronizzazione XHR, che non è mai una buona cosa).
Lo script sopra dovrebbe essere incluso in linea nella parte superiore delle pagine, accodando i download degli script il prima possibile senza interrompere il rendering progressivo ed essere eseguito il prima possibile nell'ordine specificato. "2.js" può essere scaricato gratuitamente prima di "1.js", ma non verrà eseguito fino a quando "1.js" non sarà stato scaricato o eseguito correttamente o non verrà eseguito. Evviva! download asincrono ma esecuzione ordinata !
Tuttavia, questo potrebbe non essere il modo più veloce per caricare gli script:
(...) Con l'esempio sopra, il browser deve analizzare ed eseguire gli script per scoprire quali script scaricare. Ciò nasconde i tuoi script dagli scanner precaricati. I browser utilizzano questi scanner per scoprire le risorse sulle pagine che probabilmente visiterai in seguito, oppure per scoprire le risorse delle pagine mentre il parser è bloccato da un'altra risorsa.
Possiamo aggiungere nuovamente la rilevabilità inserendola nella parte superiore del documento:
<link rel="subresource" href="//other-domain.com/1.js">
<link rel="subresource" href="2.js">
Questo dice al browser che la pagina ha bisogno di 1.js e 2.js. link [rel = subresource] è simile al link [rel = prefetch], ma con una semantica diversa. Purtroppo al momento è supportato solo in Chrome e devi dichiarare quali script caricare due volte, una volta tramite elementi di collegamento e di nuovo nel tuo script.
Correzione: inizialmente avevo dichiarato che erano stati raccolti dallo scanner di precarico, non lo sono, sono stati raccolti dal normale parser. Tuttavia, lo scanner di precaricamento potrebbe rilevarli, ma non lo fa ancora, mentre gli script inclusi nel codice eseguibile non possono mai essere precaricati. Grazie a Yoav Weiss che mi ha corretto nei commenti.
async
è nuovo (ish), madefer
fa parte di IE da IE4.defer
è stato aggiunto ad altri browser molto più recentemente, ma le versioni precedenti di quei browser tendono a rimanere molto meno.