2012-03-04 42 views
32

He preguntado similar question antes, pero nunca dejé en claro mi punto de vista, o al menos creo que es una pregunta tan relevante que vale la pena mencionarlo y ver si alguien puede dar algunas ideas perspicaces.¿Por qué se recomienda jQuery.ready cuando es tan lento?

Al utilizar jQuery, muchos de nosotros usamos la función jQuery.ready para ejecutar una init cuando el DOM ha cargado. Se ha convertido en la forma estándar de facto de agregar programas de manipulación DOM a una página web usando jQuery. Existe un evento relacionado natively algunos navegadores, pero jQuery lo emula en otros navegadores, como algunas versiones de IE. Ejemplo:

<head> 
<script> 
    var init = function() { alert('hello world'); }; 
    $.ready(init); 
</script> 

Ahora, todas nuestras pruebas muestran que este evento puede ser bastante lento. No es tan lento como window.onload, pero a menudo todavía tiene una demora de 100 ms antes de la ejecución. Si FF puede ser de hasta 200-300 ms, especialmente en la actualización.

Estos son algunos milisegundos muy importantes, porque esta es la cantidad de tiempo que se muestra el diseño inicial antes de realizar cualquier manipulación DOM (como ocultar un menú desplegable). Muchas veces, un "parpadeo" de diseño se debe principalmente al uso de un evento lento preparado para DOM, lo que obliga a los programadores a ocultar elementos mediante CSS en lugar de hacerlo potencialmente menos accesibles.

Ahora bien, si en lugar colocamos una función init en una etiqueta de script antes de cerrar la etiqueta del cuerpo, que se ejecutará mucho más rápido, por lo general alrededor de la mitad del tiempo, pero a veces incluso más rápido:

<head> 
<script> 
    var init = function() { alert('hello world'); }; 
</script> 
</head> 
<body> 
<!-- some HTML --> 
<script>init();</script> 
</body> 

Una página sencilla prueba eso demuestra las diferencias: http://jsbin.com/aqifon/10

Quiero decir, no estamos hablando de diferencias apenas perceptibles ya que algunos de los "optimizadores de la policía" promueven cuando se trata de usar selectores efectivos. Estamos hablando de algunas demoras mayores al realizar cargas de manipulación DOM. Al probar este ejemplo en FF, domready a veces puede ser más de 100 veces más lento (300 ms frente a 2 ms).

Ahora a mi pregunta: ¿Por qué se recomienda usar jQuery.ready cuando es obviamente mucho más lento que otras alternativas? ¿Y cuáles son los inconvenientes de llamar al init antes de cerrar el CUERPO contra el uso de jQuery.ready? Podría decirse que es más "seguro" usar domReady, pero ¿en qué contexto es más seguro que la otra opción? (Estoy pensando cosas como document.write y scripts diferidos) Hemos utilizado la forma BODY durante casi 5 años en muchos sitios de clientes, y nunca nos encontramos con ningún problema. Es mucho más rápido.

También me pregunto, dado que hay tanta confusión acerca de jsPerf y la optimización de los selectores por un par de ms por cada 10.000 ejecuciones, ¿cómo es que no se habla mucho de esto? Básicamente es la primera demora que enfrenta el usuario, y parece ser bastante simple dividir 50-100 ms en cada carga de página ...

Respuesta

8

Para el primer punto:

No, no hay ningún inconveniente en que init llamando antes de cerrar la <body>. Será como usted ha notado un mejor desempeño que el confiar en $.ready() y también trabajará con todos los navegadores sin problemas (incluso en IE).

Ahora, sin embargo, hay razones para usar $.ready(), que en su caso no se aplican probablemente:

  1. $.ready() hace que sea fácil para los desarrolladores hacer cosas en el orden correcto. En particular, lo más importante es no hacer referencia a los elementos DOM que no se han cargado. Si bien esto es bastante simple, muchos desarrolladores aún lo encuentran confuso. $.ready() es una obviedad, aunque lenta.
  2. En usted tiene que decir varios scripts que necesitan init(), no es necesariamente fácil/conveniente para manualmente hacer eso en el extremo de su cuerpo. Requiere disciplina y conocimiento de lo que hacen estos guiones. En particular, a menudo verá $.ready() en bibliotecas dependientes de jQuery, ya que hace que las cosas funcionen sin importar de qué manera los desarrolladores usarán para cargar las librerías.
  3. Con asíncrono módulo definición (por ejemplo require.js) cada vez más popular como una manera de cargar el Javascript, al final de <body/> método no está garantizado.
6

Una ventaja sería que puede colocar el código en cualquier lugar de la página . En nuestro caso, utilizamos un sistema de plantillas en nuestro CMS que sutura la página de alrededor de 10 a 30 plantillas para las diferentes partes (dependiendo de la complejidad).

Dado que desea que las plantillas funcionen en cualquier página que se utilicen, debe incluir el Javascript necesario en ella. Para esos casos, la función ready() es un verdadero salvavidas.

+3

Sí, este argumento podría ser etiquetado 'conveniencia' y eso es justo lo suficiente. Probablemente se podría disparar los enlaces jQuery.ready al final de la costura plantilla aunque ... – David

2

Si ha escrito un archivo JS que otras personas están incluyendo en sus páginas, es más seguro usar document.ready dentro de ese archivo (suponiendo que necesita hacer algún procesamiento automáticamente después de que DOM esté listo) porque puede ' t Asegúrese de que el archivo se incluya en la cabeza o en el extremo del cuerpo.

Cuando se trata de páginas sobre las que tiene un control total, entonces obviamente no tiene esa preocupación, así que no veo que sea más "seguro" usar document.ready en lugar de llamar a su init() desde el final del cuerpo Usar document.ready (o onload) y poner script en el extremo del cuerpo son las dos formas más comunes de hacerlo, y son comunes porque ambos funcionan bien.

Mencionó document.write() como una posible excepción, pero no desea llamar a eso desde document.ready o al final del cuerpo porque de cualquier manera toda la página ya ha sido analizada.

+0

Para que quede claro: no estoy hablando de poner guiones al final del documento (como se promueve Yahoo), estoy hablando sobre la inicialización de las secuencias de comandos antes de cerrar el cuerpo (aunque el problema de carga completo se ha agotado básicamente si también colocas las secuencias de comandos al final del documento). – David

0

, dado que hace domready y window.load más lento.

Es fácil para optimizar la métrica, en lugar de la experiencia real del usuario. Entonces los gráficos de "optimización del usuario real" disminuyen, aunque la interacción se retrasa.

Cuestiones relacionadas