Ventajas y desventajas: poner javascript en la cabeza y ponerlo justo antes del cierre del cuerpo

87

La mayoría de los libros / artículos de desarrollo web y de javascript dicen que debe poner CSS en la etiqueta principal y javascript en la parte inferior de la página.

Pero cuando abro la fuente html de sitios web famosos como este stackoverflow, encuentro que colocan algunos archivos js en la etiqueta head.

¿Cuáles son los pros y los contras de ambos enfoques y cuándo usarlos?

Encontré otra pregunta para el mismo problema: ¿Dónde debo declarar los archivos JavaScript utilizados en mi página? ¿En <head> </head> o cerca de </body>?

Amr Elgarhy
fuente

Respuestas:

63

De las mejores prácticas de Yahoo para acelerar su sitio web :

El problema causado por los scripts es que bloquean las descargas paralelas. La especificación HTTP / 1.1 sugiere que los navegadores no descarguen más de dos componentes en paralelo por nombre de host. Si sirve sus imágenes desde varios nombres de host, puede obtener más de dos descargas en paralelo. Sin embargo, mientras se descarga un script, el navegador no iniciará ninguna otra descarga, incluso en diferentes nombres de host.

En algunas situaciones, no es fácil mover los scripts al final. Si, por ejemplo, el script usa document.write para insertar parte del contenido de la página, no se puede mover hacia abajo en la página. También puede haber problemas de alcance. En muchos casos, hay formas de solucionar estas situaciones.

Una sugerencia alternativa que surge a menudo es utilizar scripts diferidos. El atributo DEFER indica que la secuencia de comandos no contiene document.write y es una pista para los navegadores de que pueden continuar procesando. Desafortunadamente, Firefox no admite el atributo DEFER. En Internet Explorer, el script puede aplazarse, pero no tanto como se desee. Si se puede aplazar un guión, también se puede mover al final de la página. Eso hará que sus páginas web se carguen más rápido.

Por tanto, en general, es preferible ponerlos en la parte inferior. Sin embargo, no siempre es posible, y que a menudo no hace que gran parte de una diferencia de todos modos.

David Johnstone
fuente
Tengo un ejemplo que mueve un cuadrado en un lienzo y no funcionará si coloco el javascript en la parte principal del HTML. Tiene que estar en la parte inferior del cuerpo después de que se declare el Canvas. ¿Hay alguna razón para esto o cómo mantendría todo mi Javascript en la sección <head> del archivo?
Doug Hauf
@DougHauf No estoy seguro de si soy exacto en esto, pero ¿ha agregado un oyente DOMContentLoaded? Le pregunto porque si tiene su secuencia de comandos en la parte inferior y se muestra en el lienzo bien; es porque el lienzo ya se había cargado en la pantalla antes de que intentara escribir en él. Ahora, si coloca el script en el encabezado, no se dibujará en el lienzo porque el lienzo aún no está allí. Entonces, si agrega el oyente, activará su código de lienzo DESPUÉS de que se haya cargado el lienzo.
Matthew D Auld
1
No sé cuántos años tiene el documento que estás citando, pero parece que el atributo aplazar ha sido compatible con Firefox durante bastante tiempo .
user2428118
Gracias, esto me ayuda mucho
Tonydeleon
31

Como han dicho otras personas, cuando pones javascript en la cabecera, se retrasa la presentación de la página hasta que se hayan cargado los scripts, lo que significa que la página puede tardar más en cargarse, especialmente si estás descargando archivos de script grandes.

Si mueve sus etiquetas de secuencia de comandos al final de la página, se asegurará de que el navegador descargue las imágenes y hojas de estilo antes de las etiquetas de secuencia de comandos y es probable que la página se muestre antes de que las secuencias de comandos comiencen a ejecutarse. Esto también significa que si depende de alguna funcionalidad de sus scripts, esto no estará disponible hasta un poco después de que la página sea visible para el usuario.

Si está agregando estilos o elementos (etc., cambiando los campos de texto con alguna forma de editor más rico), esto será visible para el usuario como parpadeando.

Si está agregando eventos de clic a elementos, no se podrá hacer clic en ellos hasta un poco después de que los elementos mismos sean visibles.

A veces, estos problemas requieren que pongas tus scripts en la cabeza, otras veces estarás bien pegándolos en la parte inferior.

En mi humilde opinión (completamente en contra de YSlow y de muchas personas inteligentes), debe mantener sus scripts en la etiqueta principal y confiar en ellos para que se almacenen en caché la mayor parte del tiempo.

AHM
fuente
9

En general, debe colocar referencias a secuencias de comandos al final de su página. Los scripts no solo deben descargarse, también deben evaluarse y ejecutarse antes de que se libere el bloque y la página continúe con el proceso de renderizado. Cosas como Modernizr deben colocarse en la parte superior porque realiza algunas detecciones de funciones, así como también shims de HTML5 que probablemente querrá.

Otra razón por la que desea colocar scripts en la parte inferior de la página son los puntos únicos de falla o SPOF. Aquí es donde se agota el tiempo de espera de una llamada de script o, por alguna otra razón, bloquea la ejecución de la página. Esto puede suceder mucho con bibliotecas publicitarias de terceros, etc.

Sí, es posible que tenga que pensar un poco más sobre cómo diseñar su aplicación, pero me pareció muy natural muy rápidamente. He creado cientos de aplicaciones web durante los últimos 4 años con el script en la parte inferior y puedo notar la diferencia. Puede que sea de 500 ms, puede que sea de 5000 ms, pero todo importa.

Chris Love
fuente
5

Realmente depende de tu sitio web. Si está accediendo e invocando las funciones de JavaScript dentro del cuerpo, entonces debe ser referenciado en el encabezado para que se cargue. De lo contrario, si solo va a llamar a JavaScript cuando se cargue todo el documento, es aconsejable colocar JavaScript al final del cuerpo. Al poner el archivo .JS al final, carga la página completa y luego recupera el archivo .JS. De esta forma, el usuario podrá ver rápidamente la página y cuando se familiarice con la página, el archivo .JS ya se ha descargado.

azamsharp
fuente
4

Cualquier javascript en el encabezado se evaluará antes de que se cargue la página, lo que significa que la página parece que tarda más en cargarse. Es un poco más difícil hacer que los eventos funcionen correctamente si todo el javascript está al final, pero jQuery prácticamente resuelve este problema por ti.

Draemon
fuente
2
¿Podría mencionar cómo jQuery resuelve este problema por interés?
Matthew Lock
jQuery tiene una API para vincular controladores a eventos
Draemon