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?

Scott
fuente

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");
MikeSchinkel
fuente
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.

Leonya
fuente
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.

Unix de nuevo
fuente