JavaScript discreto: <script> na parte superior ou inferior do código HTML?

90

Li recentemente o manifesto do Yahoo Melhores práticas para acelerar seu site . Eles recomendam colocar a inclusão de JavaScript na parte inferior do código HTML quando possível.

Mas onde exatamente e quando?

Devemos colocá-lo antes de fechar </html>ou depois? E, acima de tudo, quando ainda devemos colocá-lo na <head>seção?

e-satis
fonte

Respostas:

87

Existem duas possibilidades para scripts verdadeiramente discretos:

  • incluindo um arquivo de script externo por meio de uma tag de script na seção head
  • incluindo um arquivo de script externo por meio de uma tag de script na parte inferior do corpo (antes </body></html>)

O segundo pode ser mais rápido, pois a pesquisa original do Yahoo mostrou que alguns navegadores tentam carregar arquivos de script quando atingem a tag do script e, portanto, não carregam o resto da página até que tenham terminado. No entanto, se o seu script tiver uma parte 'pronta' que deve ser executada assim que o DOM estiver pronto, você pode precisar tê-lo no cabeçalho. Outro problema é o layout - se o seu script vai alterar o layout da página, você deseja que ele seja carregado o mais cedo possível, para que sua página não perca muito tempo se redesenhando na frente dos usuários.

Se o site de script externo estiver em outro domínio (como widgets externos), pode valer a pena colocá-lo na parte inferior para evitar atrasar o carregamento da página.

E para quaisquer problemas de desempenho, faça seus próprios benchmarks - o que pode ser verdade em um momento quando um estudo é feito pode mudar com sua própria configuração local ou mudanças nos navegadores.

domgblackwell
fonte
13
Em relação ao script ter uma parte 'pronta'. Colocar esse script na parte inferior do corpo garante que o DOM está pronto para ser manipulado, se você colocá-lo na cabeça, terá que embrulhá-lo para que aguarde o evento DOMReady (ou similar)
Juan Mendes
4
@Juan Sim, sim, mas ao colocar o script na parte inferior, você está atrasando o evento DOMReady pela quantidade de tempo necessária para que o navegador analise o documento e processe os elementos principais (200-500ms), antes de solicitar esse script . Principalmente no primeiro carregamento da página (supondo que possa ser armazenado em cache a partir daí). Considerando que se você colocá-lo na cabeça. É provável que fique pronto muito mais rápido. Portanto, com o HTML5 em mente, se o script tiver que modificar o layout quando o DOM estiver pronto, agora é melhor usar um script "assíncrono" ou "adiar" na cabeça.
hexalys
31

Nunca é tão simples - o Yahoo recomenda colocar os scripts logo antes da </body>tag de fechamento , o que criará a ilusão de que a página carrega mais rápido em um cache vazio (já que os scripts não bloquearão o download do restante do documento). No entanto, se você tiver algum código que deseja executar no carregamento da página, ele só começará a ser executado depois que a página inteira for carregada. Se você colocar os scripts na <head>tag, eles começarão a ser executados antes - então, em um cache preparado, a página realmente parece carregar mais rápido.

Além disso, o privilégio de colocar scripts na parte inferior da página nem sempre está disponível. Se você precisar incluir scripts embutidos em suas visualizações que dependem de uma biblioteca ou algum outro código JavaScript sendo carregado antes, você deve carregar essas dependências na <head>tag.

Em suma, as recomendações do Yahoo são interessantes, mas nem sempre aplicáveis, e devem ser consideradas caso a caso.

Eran Galperin
fonte
1
Se você tiver um javscript discreto, não terá snippets embutidos, a questão mencionada especificamente como discreta.
Juan Mendes
1
<script>tags embutidas não implicam em javascript intrusivo.
Eran Galperin
@Eric Galperin: Qual é um bom uso de tags de script embutido que não é intrusivo?
Juan Mendes
4
@Juan obstrusive Javascript significa que a IU está quebrada sem ele ou que está embutido na marcação. <script>as tags são separadas da marcação e podem ser usadas com código que aprimora a interface, mas não é obrigatório. Portanto, não há nada intrinsecamente intrusivo nas <script>tags embutidas .
Eran Galperin
4
1. Meu nome é Eran, não Eric, 2. Quando você deseja passar dados para Javascript de uma linguagem do lado do servidor, em um loop de itens, por exemplo, você pode usar <script>tags para codificar esses valores em variáveis ​​javascript, para uso talvez com edição embutida ou outro comportamento semelhante.
Eran Galperin
22

Como já foi dito, coloque-o antes das tags html do corpo de fechamento .

Outro dia, recebemos várias ligações de clientes reclamando que seus sites eram extremamente lentos. Nós os visitamos localmente e descobrimos que levavam de 20 a 30 segundos para carregar uma única página. Pensando que era o mau desempenho dos servidores, nós nos conectamos - mas os servidores web e sql estavam com aproximadamente 0% de atividade.

Após alguns minutos, percebemos que um site externo estava fora do ar, ao qual estávamos criando um link para tags de rastreamento Javascript. Isso significava que os navegadores estavam acessando a tag de script na seção principal do site e esperando para baixar o arquivo de script.

Portanto, pelo menos para scripts de terceiros / externos, recomendo colocá-los como a última coisa na página. Então, se eles estivessem indisponíveis, o navegador pelo menos carregaria a página até aquele ponto - e o usuário estaria alheio a isso.

Lazlow
fonte
10
Legal história, mano :) Mas, falando sério, este é o argumento mais convincente que já vi para colocar tags de script no final da página.
user271608
16

Para resumir, com base nas sugestões acima:

  1. Para scripts externos (Google Analytics, rastreadores de marketing de terceiros, etc.) coloque-os antes da </body>tag.
  2. Para scripts que afetam o layout da página, coloque no cabeçalho.
  3. Para scripts que dependem de 'dom ready' (como jquery), considere colocar antes, a </body>menos que você tenha um motivo de caso extremo para colocar scripts em head.
  4. Se houver scripts embutidos com dependências, coloque os scripts necessários no cabeçalho.
Luke W
fonte
6

Se você quiser mexer na posição de seus scripts, o YSlow é uma ótima ferramenta para lhe dar uma ideia se isso vai melhorar ou prejudicar o desempenho. Colocar javascript em certas posições de documento pode realmente matar o tempo de carregamento da página.

http://developer.yahoo.com/yslow/

skaffman
fonte
5

Não, não deve ser após o, </html>pois isso seria inválido. O melhor lugar para colocar scripts é antes do</body>

Isso ocorre basicamente porque a maioria dos navegadores para de renderizar a página enquanto avaliam o script que você fornece. Portanto, não há problema em colocar código sem bloqueio em qualquer lugar da página (estou pensando principalmente em coisas que anexam funções ao onLoadevento, uma vez que a associação de eventos é tão rápida que é efetivamente gratuita). Um grande assassino aqui está no início da página, colocando algum script de servidor de anúncios, que pode impedir o carregamento da página antes que os anúncios tenham sido totalmente baixados, fazendo com que o tempo de carregamento de sua página tenha um balão

Laurie Young
fonte
Você sabe, se você estiver realmente preocupado com a velocidade, não haverá </body> ou </html> - as tags de fechamento para esses tipos de elemento são opcionais. Coloque o <script> bem no final e esqueça de usar </body> e </html> juntos.
Jim
9
Esperançosamente, Jim está sendo sarcástico - de qualquer forma, não siga seu conselho. O XHTML bem formado requer tags de fechamento para cada elemento, incluindo o corpo e as tags html. Se o seu código não é um XML válido, você está fazendo isso errado.
Matt Lohkamp
6
Não, não estou sendo sarcástico. Dê uma olhada na pergunta. Ele especifica HTML, não XHTML. É verdade que o XHTML válido requer essas coisas, mas o HTML válido não. Não há absolutamente nada de errado em escolher HTML e omitir as tags de fechamento para esses tipos de elemento.
Jim
2

Se você colocá-lo na parte inferior, ele carrega por último, acelerando assim a velocidade com que o usuário pode ver a página. Precisa ser antes da final, </html>caso contrário, não fará parte do DOM.

Se o código for necessário instantaneamente, coloque-o na cabeça.

É melhor colocar itens como widgets de blog na parte inferior para que, se eles não carregarem, não afetem a usabilidade da página.

Rich Bradshaw
fonte