Advertencias de uso ineficiente de jQuery en PHPStorm IDE


100

Recientemente actualicé mi versión de PHPStorm IDE y ahora me advierte sobre el uso ineficiente de jQuery.

Por ejemplo:

var property_single_location = $("#property [data-role='content'] .container");

Solicita esta advertencia:

Comprueba que los selectores de jQuery se utilizan de forma eficiente. Sugiere dividir los selectores descendientes que están precedidos por el selector de ID y advierte sobre los selectores duplicados que podrían almacenarse en caché.

Entonces mi pregunta es:

¿Por qué esto es ineficiente y cuál es la forma eficiente de hacer el selector anterior?

Supongo que en:

var property_single_location = $("#property").find("[data-role='content']").find(".container");

¿Es este el camino correcto?

Respuestas:


156

Hoy tuve la misma pregunta y pude encontrar una solución gracias a Scott Kosman aquí .

Básicamente, la respuesta es seleccionar los ID individualmente y luego usarlos .find(...)para cualquier cosa a continuación. Tomando tu ejemplo:

$("#property [data-role='content'] .container");

Cambiarlo a esto hace feliz a PhpStorm y evidentemente puede ser más del doble de rápido :

$("#property").find("[data-role='content'] .container");

1
Para mi gusto $ ('[data-role = "content"] .container', '#property'); es más legible.
3 de

26
@ n3rd Divertido, no encuentro ese enfoque legible en absoluto, pero para cada uno lo suyo dicen.
MikeSchinkel

19

Creo que la diferencia entre los dos métodos cuando se utilizan versiones recientes de jQuery y navegadores es insignificante. Construí una prueba que muestra que ahora es un 10% más rápido hacer un selector combinado en lugar de una selección en la identificación y luego buscar un caso muy simple:

http://jsperf.com/jquery-find-vs-insel

Para la selección de varios niños por clase en cualquier profundidad, el "buscar" parece ser más rápido:

http://jsperf.com/jquery-find-vs-insel/7

Hubo alguna discusión sobre esto en los foros de jQuery, pero tiene 3 años: https://forum.jquery.com/topic/which-jquery-selection-is-efficient Como señalan aquí, si está haciendo mucho operaciones en el mismo selector de ID, la mayor mejora de rendimiento se encuentra almacenando en caché el elemento de nivel superior. Por otro lado, si está haciendo solo algunas selecciones, prácticamente no habrá diferencia de rendimiento.

Por lo tanto, creo que IntelliJ está exagerando la importancia de este estilo de código.


4
En su primera prueba, está utilizando el difunto directo seleccione ">". Ejecuté tu primera prueba sin ">" y usar "buscar" es más rápido. jsperf.com/jquery-find-vs-insel/12
beardedlinuxgeek

Lo que encuentro más interesante de esto es que las últimas versiones de Safari procesan el método directo más rápido en aproximadamente un 25%. No sé qué han hecho, pero aparentemente todos los demás navegadores no se han puesto al día.
Uxonith

14

La primera pregunta es presionar Alt + Enter, y seleccionar el primer consejo en la lista, luego presionar Enter, verá lo que cree que es la forma más eficiente.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.