Acho que Jake Archibald nos apresentou algumas idéias em 2013 que podem adicionar ainda mais positividade ao tópico:
https://www.html5rocks.com/en/tutorials/speed/script-loading/
O Santo Graal está fazendo o download de um conjunto de scripts imediatamente, sem bloquear a renderização e executar o mais rápido possível, na ordem em que foram adicionados. Infelizmente, o HTML o odeia e não o deixa fazer isso.
(...)
A resposta está na especificação HTML5, embora oculta na parte inferior da seção de carregamento de scripts. " O atributo IDL assíncrono controla se o elemento será executado de forma assíncrona ou não. Se o sinalizador" force-async "do elemento estiver definido, ao obter, o atributo IDL assíncrono deve retornar true e, ao definir, o" force-async " A bandeira deve primeiro estar desabilitada… ".
(...)
Os scripts criados e adicionados dinamicamente ao documento são assíncronos por padrão ; eles não bloqueiam a renderização e são executados assim que são baixados, o que significa que podem sair na ordem errada. No entanto, podemos marcá-los explicitamente como não assí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);
});
Isso fornece aos nossos scripts uma mistura de comportamentos que não podem ser alcançados com HTML simples. Por não serem explicitamente assíncronos, os scripts são adicionados a uma fila de execução, a mesma fila a que foram adicionados em nosso primeiro exemplo de HTML simples. No entanto, ao serem criados dinamicamente, eles são executados fora da análise de documentos, para que a renderização não seja bloqueada durante o download (não confunda o carregamento de scripts não assíncronos com a sincronização XHR, o que nunca é uma coisa boa).
O script acima deve ser incluído embutido no cabeçalho das páginas, fazendo o download de scripts na fila o mais rápido possível, sem interromper a renderização progressiva, e é executado o mais rápido possível na ordem especificada. O download do "2.js" é gratuito antes do "1.js", mas não será executado até que o "1.js" tenha sido baixado e executado com êxito, ou falhe. Viva! download assíncrono, mas execução ordenada !
Ainda assim, essa pode não ser a maneira mais rápida de carregar scripts:
(...) Com o exemplo acima, o navegador precisa analisar e executar scripts para descobrir quais scripts baixar. Isso oculta seus scripts dos scanners de pré-carregamento. Os navegadores usam esses scanners para descobrir recursos nas páginas que provavelmente visitará em seguida ou descobrir os recursos da página enquanto o analisador é bloqueado por outro recurso.
Podemos adicionar a descoberta novamente colocando isso na cabeça do documento:
<link rel="subresource" href="//other-domain.com/1.js">
<link rel="subresource" href="2.js">
Isso indica ao navegador que a página precisa de 1.js e 2.js. link [rel = subresource] é semelhante ao link [rel = pré-busca], mas com semânticas diferentes. Infelizmente, atualmente, ele é suportado apenas no Chrome, e você deve declarar quais scripts carregar duas vezes, uma vez por meio de elementos de link e novamente em seu script.
Correção: originalmente, afirmei que eles foram coletados pelo scanner de pré-carregamento, não são, pelo analisador comum. No entanto, o scanner de pré-carregamento pode buscá-las, mas ainda não o faz, enquanto os scripts incluídos no código executável nunca podem ser pré-carregados. Agradeço a Yoav Weiss, que me corrigiu nos comentários.
async
é novo (ish), masdefer
faz parte do IE desde o IE4.defer
foi adicionado a outros navegadores muito mais recentemente, mas as versões mais antigas desses navegadores tendem a ficar muito menos tempo.