Eu tenho algumas perguntas sobre os atributos async
e defer
para a <script>
tag que, no meu entender, só funciona nos navegadores HTML5.
Um dos meus sites tem dois arquivos JavaScript externos que atualmente ficam logo acima da </body>
tag; o primeiro éjquery originário do google e o segundo é um script externo local.
Com relação à velocidade de carregamento do site
Existe alguma vantagem em adicionar
async
aos dois scripts que tenho na parte inferior da página?Haveria alguma vantagem em adicionar a
async
opção aos dois scripts e colocá-los no topo da página<head>
?- Isso significa que eles são baixados à medida que a página é carregada?
- Suponho que isso causaria atrasos nos navegadores HTML4, mas aceleraria o carregamento da página nos navegadores HTML5?
Usando <script defer src=...
- O carregamento dos dois scripts internos
<head>
com o atributodefer
afetaria o mesmo que os scripts anteriores</body>
? - Mais uma vez, presumo que isso atrasaria os navegadores HTML4.
Usando <script async src=...
Se eu tiver dois scripts com async
ativado
- Eles baixariam ao mesmo tempo?
- Ou um de cada vez com o restante da página?
- A ordem dos scripts se torna um problema? Por exemplo, um script depende do outro, portanto, se um for baixado mais rapidamente, o segundo poderá não ser executado corretamente etc.
Por fim, é melhor deixar as coisas como estão até que o HTML5 seja mais comumente usado?
javascript
html
Adão
fonte
fonte
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.defer
é o mesmo que colocar scripts na parte inferior do HTML, o que é comum há muitos anos.Respostas:
Mantenha seus scripts logo antes
</body>
. O Async pode ser usado com scripts localizados em algumas circunstâncias (consulte a discussão abaixo). O adiamento não fará muita diferença para scripts localizados lá, porque o trabalho de análise do DOM já foi praticamente feito de qualquer maneira.Aqui está um artigo que explica a diferença entre async e adiar: http://peter.sh/experiments/asynchronous-and-deferred-javascript-execution-explained/ .
Seu HTML será exibido mais rapidamente em navegadores mais antigos se você mantiver os scripts no final do corpo imediatamente antes
</body>
. Portanto, para preservar a velocidade de carregamento em navegadores antigos, você não deseja colocá-los em nenhum outro lugar.Se o seu segundo script depende do primeiro script (por exemplo, seu segundo script usa o jQuery carregado no primeiro script), você não pode fazê-los assíncronos sem código adicional para controlar a ordem de execução, mas pode adiar porque os scripts adiados ainda será executado em ordem, apenas após a análise do documento. Se você possui esse código e não precisa que os scripts sejam executados imediatamente, você pode fazê-los assíncronos ou adiados.
Você pode colocar os scripts na
<head>
tag e configurá-los para,defer
e o carregamento dos scripts será adiado até que o DOM seja analisado e que obtenha uma rápida exibição da página em novos navegadores compatíveis com adiamento, mas não ajudará em nada em navegadores mais antigos e não é realmente mais rápido do que apenas colocar os scripts antes do</body>
que funciona em todos os navegadores. Então, você pode ver por que é melhor colocá-los logo antes</body>
.O Async é mais útil quando você realmente não se importa quando o script é carregado e nada mais depende do usuário depende do carregamento do script. O exemplo mais citado para o uso de assíncrono é um script de análise como o Google Analytics, pelo qual você não deseja que nada espere, não é urgente que seja executado em breve e fica sozinho, portanto, nada mais depende disso.
Normalmente, a biblioteca jQuery não é uma boa candidata a assíncrona porque outros scripts dependem dela e você deseja instalar manipuladores de eventos para que sua página comece a responder a eventos do usuário e talvez seja necessário executar algum código de inicialização baseado em jQuery para estabelecer o estado inicial da página. Ele pode ser usado de forma assíncrona, mas outros scripts precisarão ser codificados para não serem executados até que o jQuery seja carregado.
fonte
head
e configurá-losdefer
não será mais rápido do que colocá-los antes</body>
, mas, pelo que li, isso está incorreto. Pense nisso - se você inserir os scripts<head>
, eles começarão a ser baixados imediatamente, enquanto que se eles estiverem corretos antes</body>
, todos os outros elementos serão baixados primeiro.Esta imagem explica a tag de script normal, assíncrona e adiada
Os scripts assíncronos são executados assim que o script é carregado, portanto, não garante a ordem de execução (um script que você incluiu no final pode ser executado antes do primeiro arquivo de script)
Adiar scripts garante a ordem de execução na qual eles aparecem na página.
Refira este link: http://www.growingwiththeweb.com/2014/02/async-vs-defer-attributes.html
fonte
async
vai ganhar. Veja stackoverflow.com/questions/13821151/…<script>
tag, o comprimento total do carregamento da página é maior pelo tempo necessário para o download do arquivo de script.HTML5:
async
,defer
No HTML5, você pode informar ao navegador quando executar seu código JavaScript. Existem 3 possibilidades:
Sem
async
oudefer
, o navegador executará seu script imediatamente, antes de renderizar os elementos abaixo da sua tag de script.Com
async
(assíncrono), o navegador continuará carregando a página HTML e renderizando-a enquanto o navegador carrega e executa o script ao mesmo tempo.Com
defer
, o navegador executará seu script quando a página terminar de analisar. (não é necessário concluir o download de todos os arquivos de imagem. Isso é bom.)fonte
async=""
antes de validar e salvar as alterações do modelo.async
- Os scripts são executados no momento em que foram baixados, sem considerar sua ordem no arquivo HTML.Os scripts
async
e osdefer
começam a baixar imediatamente sem pausar o analisador e ambos oferecem suporte a umonload
manipulador opcional para atender à necessidade comum de executar a inicialização que depende do script.A diferença entre
async
edefer
gira em torno de quando o script é executado. Cadaasync
script é executado na primeira oportunidade após o término do download e antes do evento de carregamento da janela. Isso significa que é possível (e provável) que osasync
scripts não sejam executados na ordem em que ocorrem na página. Enquanto osdefer
scripts, por outro lado, são garantidos para serem executados na ordem em que ocorrem na página. Essa execução inicia após a conclusão da análise, mas antes doDOMContentLoaded
evento do documento .Fonte e mais detalhes: aqui .
fonte
Enfrentou o mesmo tipo de problema e agora entendeu claramente como ambos funcionarão. Espero que este link de referência seja útil ...
Assíncrono
Quando você adiciona o atributo assíncrono à sua tag de script, o seguinte acontece.
Adiar
O adiamento é muito semelhante ao assíncrono, com uma grande diferença. Aqui está o que acontece quando um navegador encontra um script com o atributo defer.
Referência: Diferença entre Async e Adiar
fonte
async
edefer
fará o download do arquivo durante a análise de HTML. Ambos não interromperão o analisador.O script com
async
atributo será executado assim que for baixado. Enquanto o script comdefer
atributo será executado após a conclusão da análise do DOM.Os scripts carregados
async
não garantem nenhum pedido. Enquanto os scripts carregados com odefer
atributo mantêm a ordem em que aparecem no DOM.Use
<script async>
quando o script não depende de nada. quando o script depende do uso.A melhor solução seria adicionar a parte inferior do corpo. Não haverá problemas com o bloqueio ou a renderização.
fonte
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/
Ainda assim, essa pode não ser a maneira mais rápida de carregar scripts:
fonte
Parece que o comportamento de adiar e assíncrono depende do navegador, pelo menos na fase de execução. NOTA: o adiamento se aplica apenas a scripts externos. Estou assumindo que async segue o mesmo padrão.
No IE 11 e abaixo, a ordem parece ser assim:
No Edge, Webkit, etc., o atributo async parece ser ignorado ou colocado no final:
Nos navegadores mais recentes, o atributo data-pagespeed-no-defer é executado antes de qualquer outro script externo. Isto é para scripts que não dependem do DOM.
NOTA: Use adiar quando precisar de uma ordem explícita de execução de seus scripts externos. Isso informa ao navegador para executar todos os scripts adiados em ordem de posicionamento no arquivo.
AO LADO: O tamanho dos javascripts externos importava ao carregar ... mas não tinha efeito na ordem de execução.
Se você está preocupado com o desempenho de seus scripts, convém considerar a minificação ou simplesmente carregá-los dinamicamente com um XMLHttpRequest.
fonte
data-pagespeed-no-defer
é um atributo usado pelo módulo PageSpeed do servidor . O atributo por si próprio não tem efeito em nenhum navegador.data-pagespeed-no-defer