Ottimizzare le Performance di jQuery: cache e concatenazione

di: Marco Solazzi     17 Gennaio 2012

jQuery ha un ruolo importante nel riavvicinare gli sviluppatori web a JavaScript colmando lacune e inconsistenze nelle varie implementazioni dei browser più diffusi.

Come effetto collaterale di questo successo, in alcuni sviluppatori alle prime armi è nata la convizione che jQuery sia JavaScript, gettando le basi per produzione di codice jQuery corretto ma distante da principi di performance e organizzazione, fattori da tenere sotto controllo a prescindere dal linguaggio o dalla libreria usati,

Con questo articolo iniziamo ad analizzare alcune delle più importanti tecniche di programmazione in jQuery volte a migliorare stile e performance dei nostri script lato client.

jQuery Cache

La prima causa di bassa performance in uno script JavaScript è la cattiva gestione dell'interazione fra JavaScript e DOM.

La ragione è da ricercare nell'architettura della maggior parte dei browser, in cui i motori JavaScript e DOM sono entità distinte ed indipendenti, perciò, quando selezioniamo dei tag, ad esempio con $('#mioSelettore'), il motore JavaScript deve instanziare una nuova comunicazione con il DOM.

Se nel nostro codice abbiamo poche selezioni non è un problema, ma se la nostra applicazione interagisce pesantemente con il documento, questo colloquio fra i motori può rivelarsi un pericoloso collo di bottiglia.

Ecco uno script di esempio:

//aggiunge una classe al menu
$('#menu').addClass('has_dropdown');

//modifica una proprietà CSS
$('#menu').css('max-height', '200px');

//applica un plugin
$('#menu').dropdown();

Abbiamo sollecitato l'oggetto DOM #menu per tre volte. Tutto funziona ma effettuare per tre volte una ricerca sul DOM per ottenere lo stesso elemento, per fare un parallelo con i database è come se, per estrarre tre colonne da un record, eseguissimo tre query SQL.

Il meccanismo della "cache"

In questo caso la soluzione risiede nella natura propria della funzione $() di jQuery. Tale funzione, infatti, restituisce un oggetto jQuery che mantiene una lista numerata degli elementi selezionati ai quali si può far riferimento senza dover andare ad interrogare continuamente il DOM.

Per ottimizzare lo script precedente basterà quindi salvare la prima selezione in una variabile di cache:

//salva la selezione in una variabile di cache
var $menu = $('#menu');

//aggiunge una classe al menu
$menu.addClass('has_dropdown');

//modifica una proprietà CSS
$menu.css('max-height', '200px');

//applica un plugin
$menu.dropdown();

In questo modo effettuiamo la ricerca sul DOM solo una volta, lavorando sul riferimento all'oggetto jQuery. Nella maggior parte dei casi otterremo un aumento delle perfomance superiore al 50%.

Si può verificare l'esistenza del riferimento interagendo con l'indice, come si fa con un array:

console.log($menu[0]);
//restituirà un elemento HTML tipo <div id="menu">...</div>

Da notare che, per convenzione ormai consolidata, ogni variabile riferita ad oggetti jQuery viene scritta con un $ iniziale, in modo da essere velocemente distinguibile all'interno degli script.

Per testare l'effettiva efficacia di questa tecnica è possibile eseguire questo test presente su jsperf.com, uno dei migliori strumenti per l'analisi delle performance JavaScript.

Guide JavaScript

Guida jQuery Mobile

Creare siti mobile e applicazioni specifiche per Android, iPhone e...

Canvas, guida pratica

Canvas, tra gli elementi di HTML5 è forse quello di maggior impatto....

Guida jQuery UI

Creare siti ricchi e dinamici con jQuery UI, il progetto ufficiale...

Altre guide

Newsletter @JavaScript

Ogni martedì, direttamente nella tua e-mail: guide, articoli, script, novità e approfondimenti tecnici su JavaScript.

Iscriviti alla newsletter

Altre newsletter

Corsi in aula

Corso Google AdWords Base

27 Febbraio 2012 a Milano
Disponibilità: 7 Posti

Corso Webmaster base

12 Marzo 2012 a Milano
Disponibilità: 6 Posti

Corso JQuery e Ajax per Webmaster

19 Marzo 2012 a Milano
Disponibilità: 7 Posti

Corso Webmaster base

19 Marzo 2012 a Roma
Disponibilità: 7 Posti

Corso Google AdWords Base

28 Marzo 2012 a Roma
Disponibilità: 7 Posti