Avvisi di utilizzo inefficiente di jQuery nell'IDE di PHPStorm


100

Di recente ho aggiornato la mia versione di PHPStorm IDE e ora mi avverte dell'uso inefficiente di jQuery.

Per esempio:

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

Richiede questo avviso:

Verifica che i selettori jQuery siano utilizzati in modo efficiente. Suggerisce di dividere i selettori discendenti che sono preceduti da selettore ID e avverte dei selettori duplicati che potrebbero essere memorizzati nella cache.

Quindi la mia domanda è:

Perché questo è inefficiente e qual è il modo efficiente per eseguire il selettore di cui sopra?

Immagino che:

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

È questa la via giusta?

Risposte:


156

Oggi ho avuto la stessa domanda e sono riuscito a trovare una soluzione grazie a Scott Kosman qui .

Fondamentalmente la risposta è selezionare gli ID individualmente e quindi utilizzarli .find(...)per qualsiasi cosa sotto. Quindi, prendendo il tuo esempio:

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

Cambiarlo in questo rende PhpStorm felice e può evidentemente essere più del doppio più veloce :

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

1
Per i miei gusti $ ('[data-role = "content"] .container', '#property'); è più leggibile.
n3

26
@ n3rd Divertente, non trovo affatto leggibile quell'approccio, ma a ciascuno il suo dicono.
MikeSchinkel

19

Credo che la differenza tra i due metodi quando si utilizzano versioni recenti di jQuery e browser sia trascurabile. Ho costruito un test che mostra che ora è effettivamente il 10% più veloce per fare un selettore combinato piuttosto che una selezione su id e poi trovare per un caso molto semplice:

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

Per la selezione di più bambini per classe a qualsiasi profondità, la "ricerca" sembra essere più veloce:

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

Ci sono state alcune discussioni su questo nei forum jQuery, ma ha 3 anni: https://forum.jquery.com/topic/which-jquery-selection-is-efficient Come sottolineano qui, se stai facendo molto operazioni sullo stesso selettore di ID, il massimo miglioramento delle prestazioni si trova memorizzando nella cache l'elemento di primo livello. D'altra parte, se stai facendo solo poche selezioni, non ci sarà praticamente alcuna differenza di prestazioni.

Pertanto credo che IntelliJ stia esagerando l'importanza di questo stile di codice.


4
Nel tuo primo test, stai usando il decedente diretto seleziona ">". Ho eseguito il tuo primo test senza ">" e l'utilizzo di "trova" è più veloce. jsperf.com/jquery-find-vs-insel/12
beardedlinuxgeek

La cosa che trovo più interessante di questo è che le ultime versioni di Safari elaborano il metodo diretto più velocemente di circa il 25%. Non so cosa abbiano fatto, ma a quanto pare tutti gli altri browser non hanno capito.
Uxonith

14

La prima domanda è premere Alt + Invio e selezionare il primo suggerimento nell'elenco, quindi premere Invio, vedrai cosa pensa nel modo più efficiente.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.