JavaScript discreto: ¿<script> en la parte superior o inferior del código HTML?

90

Recientemente leí el manifiesto de Yahoo sobre las mejores prácticas para acelerar su sitio web . Recomiendan poner la inclusión de JavaScript en la parte inferior del código HTML cuando podamos.

¿Pero dónde y cuándo exactamente?

¿Debemos ponerlo antes </html>o después del cierre ? Y sobre todo, ¿cuándo deberíamos ponerlo todavía en la <head>sección?

e-satis
fuente

Respuestas:

87

Hay dos posibilidades para scripts verdaderamente discretos:

  • Incluyendo un archivo de secuencia de comandos externo a través de una etiqueta de secuencia de comandos en la sección principal
  • Incluyendo un archivo de secuencia de comandos externo a través de una etiqueta de secuencia de comandos en la parte inferior del cuerpo (antes </body></html>)

El segundo puede ser más rápido, ya que la investigación original de Yahoo mostró que algunos navegadores intentan cargar archivos de secuencia de comandos cuando presionan la etiqueta de secuencia de comandos y, por lo tanto, no cargan el resto de la página hasta que hayan terminado. Sin embargo, si su script tiene una parte 'lista' que debe ejecutarse tan pronto como el DOM esté listo, es posible que deba tenerlo en la cabeza. Otro problema es el diseño: si su secuencia de comandos va a cambiar el diseño de la página, desea que se cargue lo antes posible para que su página no pierda mucho tiempo redibujándose frente a sus usuarios.

Si el sitio de script externo está en otro dominio (como widgets externos), puede valer la pena colocarlo en la parte inferior para evitar que retrase la carga de la página.

Y para cualquier problema de rendimiento, haga sus propios puntos de referencia : lo que puede ser cierto en un momento en el que se realiza un estudio, puede cambiar con su propia configuración local o cambios en los navegadores.

domgblackwell
fuente
13
En cuanto al guión que tiene una parte "lista". Poner ese script en la parte inferior del cuerpo garantiza que el DOM está listo para ser manipulado, si lo pones en la cabeza, debes envolverlo para que espere al evento DOMReady (o similar)
Juan Mendes
4
@Juan Sí lo hace, pero al colocar el script en la parte inferior, está retrasando el evento DOMReady por la cantidad de tiempo que necesita el navegador para analizar el documento y procesar los elementos principales (200-500ms), antes de que solicite ese script. . Principalmente en la carga de la primera página (suponiendo que se pueda almacenar en caché desde allí). Mientras que si lo coloca en la cabeza. Es probable que esté listo mucho más rápido. Entonces, con HTML5 en mente, si la secuencia de comandos tiene que modificar el diseño cuando el DOM está listo, ahora estará mejor con una secuencia de comandos "asíncrona" o "diferida" en la cabeza.
hexalys
31

Nunca es tan sencillo: Yahoo recomienda colocar los scripts justo antes de la </body>etiqueta de cierre , lo que creará la ilusión de que la página se carga más rápido en un caché vacío (ya que los scripts no bloquearán la descarga del resto del documento). Sin embargo, si tiene algún código que desea ejecutar al cargar la página, solo comenzará a ejecutarse después de que se haya cargado toda la página. Si coloca los scripts en la <head>etiqueta, comenzarán a ejecutarse antes, por lo que en un caché preparado, la página parecería cargarse más rápido.

Además, el privilegio de poner scripts al final de la página no siempre está disponible. Si necesita incluir scripts en línea en sus vistas que dependen de una biblioteca o de algún otro código JavaScript que se haya cargado antes, debe cargar esas dependencias en la <head>etiqueta.

En general, las recomendaciones de Yahoo son interesantes, pero no siempre aplicables y deben considerarse caso por caso.

Eran Galperin
fuente
1
Si tiene un javscript discreto, no tendrá fragmentos en línea, la pregunta menciona específicamente que no es intrusivo.
Juan Mendes
1
Las <script>etiquetas en línea no implican un javascript intrusivo.
Eran Galperin
@Eric Galperin: ¿Cuál es un buen uso de las etiquetas de script en línea que no sean molestas?
Juan Mendes
4
@Juan Javascript obstrusivo significa que la interfaz de usuario está rota sin él o que está incrustado en el marcado. <script>Las etiquetas están separadas del marcado y se pueden usar con código que mejora la interfaz, pero no es obligatorio. De modo que no hay nada intrínsecamente molesto en las <script>etiquetas en línea .
Eran Galperin
4
1. Mi nombre es Eran, no Eric, 2. Cuando desee pasar datos a Javascript desde un lenguaje del lado del servidor, en un bucle de elementos, por ejemplo, puede usar <script>etiquetas para codificar esos valores en variables de JavaScript, para usar tal vez con edición en línea u otro comportamiento similar.
Eran Galperin
22

Como han dicho otros, colóquelo antes de las etiquetas html del cuerpo de cierre .

El otro día recibimos numerosas llamadas de clientes quejándose de que sus sitios eran extremadamente lentos. Los visitamos localmente y descubrimos que tardaban entre 20 y 30 segundos en cargar una sola página. Pensando que los servidores estaban funcionando mal, iniciamos sesión, pero tanto los servidores web como los SQL tenían una actividad de ~ 0%.

Después de unos minutos, nos dimos cuenta de que un sitio externo estaba inactivo, al que estábamos vinculando para las etiquetas de seguimiento de JavaScript. Este navegadores destinadas estaban golpeando la escritura de la etiqueta en la cabeza de la sección de la página y esperar a descargar el archivo de script.

Por lo tanto, para los scripts externos / de terceros al menos, recomendaría ponerlos como lo último en la página. Luego, si no estuvieran disponibles, el navegador al menos cargaría la página hasta ese punto, y el usuario lo ignoraría.

Lazlow
fuente
10
Genial historia hermano :) Pero en serio, este es el argumento más convincente que he visto para colocar etiquetas de script en la parte inferior de la página.
user271608
16

Para resumir, basado en las sugerencias anteriores:

  1. Para scripts externos (Google Analytics, rastreadores de marketing de terceros, etc.) colóquelos antes del </body> etiqueta.
  2. Para los scripts que afectan el diseño de la página, coloque head.
  3. Para scripts que dependen de 'dom ready' (como jquery), considere colocar antes </body> menos que tenga una razón de caso límite para colocar los scripts en la cabeza.
  4. Si hay scripts en línea con dependencias, coloque los scripts necesarios en el encabezado.
Luke W
fuente
6

Si desea modificar la posición de sus scripts, YSlow es una gran herramienta para darle una idea de si va a mejorar o dañar el rendimiento. Poner javascript en ciertas posiciones de documentos puede realmente matar los tiempos de carga de la página.

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

skaffman
fuente
5

No, no debería ser posterior a la </html>ya que sería inválido. El mejor lugar para colocar los scripts es justo antes del</body>

Esto se debe básicamente a que la mayoría de los navegadores dejan de mostrar la página mientras evalúan el script que usted proporciona. Por lo tanto, está bien colocar código sin bloqueo en cualquier lugar de la página (estoy pensando principalmente en cosas que adjuntan funciones al onLoadevento, ya que el enlace de eventos es tan rápido que efectivamente es gratuito). Un gran asesino aquí es al comienzo de la página que se coloca en un script del servidor de anuncios, lo que puede evitar que la página se cargue antes de que los anuncios se hayan descargado por completo, lo que hace que los tiempos de carga de su página se disparen.

Laurie Young
fuente
Ya sabes, si realmente te preocupa la velocidad, entonces no habrá </body> o </html>; las etiquetas de cierre para estos tipos de elementos son opcionales. Coloque <script> al final y olvídese de usar </body> y </html> por completo.
Jim
9
Con suerte, Jim está siendo sarcástico; en cualquier caso, no sigas su consejo. XHTML bien formado requiere etiquetas de cierre para cada elemento, incluidas las etiquetas body y html. Si su código no es XML válido, lo está haciendo mal.
Matt Lohkamp
6
No, no estoy siendo sarcástico. Eche un vistazo a la pregunta. Especifica HTML, no XHTML. Es cierto que el XHTML válido requiere estas cosas, pero el HTML válido no. No hay absolutamente nada de malo en elegir HTML y omitir las etiquetas de cierre para estos tipos de elementos.
Jim
2

Si lo coloca en la parte inferior, se carga al final, lo que acelera la velocidad a la que el usuario puede ver la página. Tiene que estar antes de la final, </html>aunque de lo contrario no será parte del DOM.

Sin embargo, si el código se necesita instantáneamente, póngalo en la cabeza.

Es mejor poner cosas como widgets de blog en la parte inferior para que si no se cargan, no afecte la usabilidad de la página.

Rich Bradshaw
fuente