jQuery contro tutti: un benchmark con 5 browser

Mercoledì 17 Settembre, 2008

image Un buon sviluppatore non ha problemi a passare da un linguaggio di programmazione ad un altro. La scelta di concentrarsi su un particolare linguaggio, framework o ambiente di sviluppo, è dettata più dalla disponibilità di tempo e dal tipo di lavoro che si svolge. Tuttavia, un fattore importante che può influire sulla scelta di "framework" simili, è la simpatia o l'affezione che può maturare con il tempo.
Nello specifico, ho voluto analizzare alcuni - non certo tutti - framework Javascript disponibili oggi, anche perchè "consigliato" a dare un'occhiata soprattutto a jQuery.
I creatori di mootools (uno dei più noti framework Javascript) hanno reso disponibile uno strumento per eseguire un test di velocità e validità su cinque noti framework Javascript: Slickspeed. Questo test, dagli esiti non affatto scontati, è importante in quanto i framework Javascript operano lato client, cioè vengono eseguiti dal nostro browser. È proprio per questo motivo che alcuni trovano Safari più rapido di Internet Explorer o Google Chrome più rapido di FireFox. Tuttavia ciò spesso dipende anche dal tipo di pagina che si sta visualizzando. Infatti può benissimo capitare che un particolare sito sia davvero più "veloce" se visualizzato in Safari, ma questo non significa che "tutti i siti" saranno più veloci con Safari! Ovviamente questo discorso è valido per qualsiasi altro browser.

Il benchmark

Nel test che ho effettuato con Slickspeed ho messo a confronto i browser disponibili sulla mia macchina (Windows Vista Utilmate 64bit - Intel core 2 quad a 2.4GHz con 8Gb RAM).
Purtroppo il test non sono riuscito ad eseguirlo con Internet Explorer 7, in quanto bloccava la macchina, andando anche fuori scala con i risultati! Ancora una volta complimenti Microsoft.
Ho crercato di mantenere identico lo stato del PC durante l'esecuzione dei test, aprendo singolarmente i browser e non mandando nessun altro processo in esecuzione.

Nota: se avete voglia di eseguire anche voi uno o più di questi test, potete commentare questo post in caso di "curiosi" e diversi risultati.

image

Google Chrome è risultato davvero veloce, con un valore di 68 (media) nell'esecuzione dei test con jQuery. Il più lento, invece, è risultato Flock, nonostante provenga dalla stessa "madre" Mozilla. Questo pessimo risultato di Flock è davvero curioso visto il suo taglio Social Network; perchè sono proprio i Social Network Web 2.0 a sfruttare molti dei framework Javascript disponibili, così da fornire un'esperienza di navigazione ed interazione davvero innovativa.
A sorpresa Opera batte FireFox e anche di un bel po', ottenendo addirittura un 74 nell'esecuzione di Dojo! FireFox e Safari, tutto sommato, si assomigliano, con Safari più rapido nei test con Mootools e jQuery.

Quale framework scegliere?

Se non badiamo ai test sulla velocità di esecuzione e non ci preoccupiamo della dimesione in Kbytes dei framework stessi, la risposta potrebbe essere "quello che più vi piace" o, se preferite, "quello che conoscete meglio o vi risulta più armonico con il vostro stile di programmazione".
In ultima analisi questi framework si assomigliano un po' tutti (vedi l'uso del $ ad esempio), nonostante alcune importanti e sostanziali differenze che possono saltare agli occhi di un esperto o nell'uso davvero spinto di una particolare libreria. In linea di massima, infatti, tutto quello che si può realizzare con jQuery, ad esempio, lo si può fare benissimo con mootools o prototype! Se jQuery vanta una sintassi estremamente compatta, in quanto tutti i metodi restituiscono sempre l'oggetto base jQuery, creando così file interminabili di oggetto.metodo().metodo().metodo()... non è detto che questo sia a tutti i costi un punto di forza, soprattutto per chi dovrà fare il debug!
Librerie come prototype.js peccano forse in assenza di effetti grafici, anche semplici, costringendo lo sviluppatore ad implementare spinoff come scriptaculous.js, pesanti e distanti dalla libreria inizialmente scelta.

Un esempio

Proprio quest'ultimo motivo, ad esempio, mi ha portato a sostituire l'accoppiata prototype/scriptaculous con jQuery per realizzare i pannelli interattivi/animati qui nella sidebar di undolog.com. In effetti, usando anche Google API per importare le librerie, è uno spreco caricare tutta la libreria scriptaculous per uno slideDown e slideUp. A titolo informativo e di esempio, ecco com'era il codice Javascript con l'accoppiata prototype/scriptaculous:

JavaScript:
  1. // prototype/scriptaculous
  2. $$('h2.dropdown').each(
  3.     function(element) {
  4.         element.style.cursor="pointer";
  5.         element.observe('click',
  6.             function(event) {
  7.                 if( this.next().style.display == "" ) new Effect.BlindUp(this.next(),{duration:.5});
  8.                 else new Effect.BlindDown(this.next(),{duration:.3});
  9.                 Event.stop(event);
  10.             }
  11.         )
  12.     }
  13. );

e com'è adesso con jQuery:

JavaScript:
  1. // jQuery
  2. $('h2.dropdown').each(
  3.     function(i) {
  4.         $(this).css('cursor','pointer').click(
  5.             function() {
  6.                 if( $(this).next().is(':hidden') ) $(this).next().slideDown(); else $(this).next().slideUp();
  7.             }
  8.         );
  9.     }
  10. );

Tutto sommato, a ben guardare, non mi sembra ci sia moltissima differenza! Ma come dicevo prima... è questione "anche" di gusto personale.

Post correlati

jQuery restyling

Domenica 31 Agosto, 2008

Proprio in questi giorni (sotto consiglio...) stavo dando un'occhiata a jQuery, un'ottima libreria sullo stile di prototype.js, scriptaculous.js, mooTools, per intenderci... ed ecco che oggi tutto il sito è stato completamente ridisegnato:

image

Ottimo inizio per allargare i miei orizzonti su questo tipo di librerie! Prossimamente pubblicherò qualche articolo interessante, soprattutto sulle differenze tra jQuery e le altre librerie "simili".

Post correlati

Simple Accordion con la classe USimpleTabStrip

Mercoledì 20 Agosto, 2008

La classe USimpleTabStrip, presentata in Unobtrusive Simple TabStrip, può essere utilizzata anche per realizzare un semplice menu Accordion.
Utilizzando gli effetti di BlindUp() e BlindDown() offerti da Scriptaculous:

JavaScript:
  1. function init(){
  2.     uts = new USimpleTabStrip();
  3.     uts.Init();
  4.     uts.onShow = function(e) {
  5.         new Effect.BlindDown(e);
  6.     }           
  7.     uts.onHide = function(e) {
  8.         new Effect.BlindUp(e);
  9.     }           
  10. }

E riposizionando gli elementi HTML (sorgente HTML):

HTML:
  1. <div class="accordion">
  2.     <a href="#acc1">Accordion 1</a>
  3.     <a name="acc1"></a>
  4.     <div>
  5.         <h1>Content #1</h1>
  6.          <p>Bla bla bla....</p>
  7.     </div>
  8.  
  9.     <a href="#acc2">Accordion 2</a>
  10.     <a name="acc2"></a>
  11.     <div>
  12.         <h1>Content #2</h1>
  13.          <p>Bla bla bla....</p>
  14.     </div>
  15.  
  16.     <a href="#acc3">Accordion 3</a>
  17.     <a name="acc3"></a>
  18.     <div>
  19.         <h1>Content #3</h1>
  20.          <p>Bla bla bla....</p>
  21.     </div>
  22.  
  23. </div>

Si ottiene un semplice menu Accordion che può essere utilizzato in modo estremamente rapido.

Post correlati

Unobtrusive Simple TabStrip

Giovedì 14 Agosto, 2008

USimpleTabStrip è un Unobtrusive Javascript in grado di migliorare i classici link anchor (ancora) all'interno di una pagina HTML. Questo sorgente è un miglioramento della funzione presentata in Unobtrusive Tabstrip. In questa versione oltre ad allineare il codice alle release 1.6 di prototype.js è stata creata una vera e propria classe per gestire i TabStrip. La release qui presentata è molto semplice e lineare. Il suo principale lavoro risiede nell'aggiungere un evento click ai normali link anchor. Non sono inoltre presentati stili CSS, proprio per lasciare la massima libertà d'azione; tuttavia è possibile ottenere un efficace TabStrip con poche righe di codice CSS aggiuntivo; vedi Aggiungere degli stili CSS più sotto.

Codice HTML

La classe USimpleTabStrip lavora su un HTML molto semplice, sftuttando gli anchor (<a name></a>):

HTML:
  1. <!-- Semplice lista di link all'interno della pagina -->
  2.     <li><a href="#tbs1">Link 1</a></li>
  3.     <li><a href="#tbs2">Link 2</a></li>
  4.     <li><a href="#tbs3">Link 3</a></li>
  5. </ul>
  6.  
  7. <!-- Blocchi/tabs -->
  8.  
  9. <a name="tbs1"></a>
  10.     <div>
  11.         <h1>Scheda #1</h1>
  12.         <p>Bla bla bla....</p>
  13.     </div>
  14.  
  15. <a name="tbs2"></a>
  16.     <div>
  17.         <h1>Scheda #2</h1>
  18.         <p>Bla bla bla....</p>
  19.     </div>
  20.  
  21. <a name="tbs3"></a>
  22.     <div>
  23.         <h1>Scheda #3</h1>
  24.         <p>Bla bla bla....</p>
  25.     </div>

Il tag div subito sotto l'anchor a funziona da contenitore.

Continua a leggere... »

Post correlati

Tecniche di Text Replacement in Flash

Mercoledì 25 Giugno, 2008

La tecnica di Text Replacement che presento oggi è, per certi aspetti, davvero interessante. A differenza della classica sostituizione per immagine tramite CSS, questa tecnica usa un filmato Flash per sovrascrivere i titoli del nostro sito. Nonostante sia un pochino più articolata, in quanto richiede la creazione di un filmato Flash e l'uso di Javascript, permette di ottenere una serie di vantaggi non indifferenti:

  • Mantiene l'accessibilità del sito sfruttando un True-Unobtrusive-Javascript in modo che crawler e spider continuino a vedere la pagina come semplice e corretto HTML
  • Non richiede la creazione di n immagini per n titoli. Basta un solo filmato per sostituire tutti i titoli del nostro sito, con un notevole risparmio in termini di Download
  • Permette di creare anche titoli semplici ma con Font normalmente non utilizzati sul Web
  • Il testo può essere reso in HTML, grazie alle caratteristiche di Flash
  • Il testo è selezionabile
  • Essendo un filmato Flash si può inserire interattività e animazioni di qualsiasi sorta

Noterete, anche, che in questa procedura i CSS non sono praticamente presi in considerazione!

Continua a leggere... »

Post correlati

Google AJAX Library API: una svolta per gli sviluppatori

Giovedì 29 Maggio, 2008

AJAX Libraries API Google, in quest'ultimo perdiodo, ha rilasciato una moltitudine di strumenti dedicati agli sviluppatori, aggiornando di continuo i propri rilasci. Adesso stringe un accordo con i più diffusi framework AJAX, e non solo, per centralizzare la distribuzione delle librerie jQuery, prototype, script.aculo.us, MooTools e dojo!

In pratica è possibile accedere a queste librerie sfruttando le infrastrutture e la rete Google, con notevoli vantaggi in termini di velocità e sicurezza.

La velocità, nel caricamento, è garantita dalla stessa rete Google che, oltre a fornire di per se una struttura di server distribuita, permette (di default) il caricamento compresso (gzip/minify) delle librerie. Gli hosting Google più vicini alla richiesta saranno utilizzati per inviare il codice e, in caso di non raggiungimento o down temporaneo, la rete Google garantirà comunque l'invio del codice Javascript!

Continua a leggere... »

Post correlati

Google AJAX API Language e Prototype.js

Martedì 13 Maggio, 2008

Dopo aver visto il funzionamento delle Google AJAX API mi è venuto in mente un modo alternativo per tradurre realtime le nostre pagine Web. Sfruttando prototype.js è possibile marcare i TAG HTML che desideriamo tradurre, invece di sottoporre l'intero documento alla traduzione. Per marcare i TAG HTML da tradurre ho usato l'attributo rel, impostandolo a translate:

HTML:
  1. <p rel="translate">Questo testo deve essere tradotto</p>

Con una semplice funzione, poi, possiamo sfruttare prototype.js per elaborare tutti i  TAG HTML con rel='translate':

JavaScript:
  1. /*
  2. ** @name         : translate()
  3. ** @description  : translate
  4. */
  5. function translate() {
  6.     $$('[rel="translate"]').each(
  7.         function(e) {
  8.             google.language.translate(e.innerHTML, 'it', 'en',
  9.                 function(result) {
  10.                     if (result.translation) {
  11.                         e.innerHTML = result.translation;
  12.                     } else {
  13.                         alert( 'Translate Error!\n\n' + result.error.message );
  14.                     }
  15.                 }
  16.             );                                         
  17.         }
  18.     );
  19. }

Potete vedere questa funzione in azione su e-lementi.com

Ovviamente lo script può (e/o deve) essere perfezionato a seconda dei casi. È interessante notare, tuttavia, che è possibile specializzarlo in modo tale da sostituire delle immagini (nel caso di bottoni in grafica che contengono testo) o fargli elaborare TAG particolari come INPUT o TEXTAREA.

Uno dei limiti che ho riscontrato, e che voorei approfondire, riguarda il numero di caratteri che possono essere tradotti. In caso di testi importanti, infatti, non è difficile ottenere un errore: che infatti ho gestito nello script con un alert().

Post correlati

HTML dinamico con Prototype: stili e script

Venerdì 9 Maggio, 2008

Oltre un anno fa avevo scritto un post ( HTML dinamico con Javascript) che illustrava alcune tecniche per aggiungere dinamicamente fogli di stile e script ad una pagina HTML già caricata. Chi usa Prototype.js si può semplificare notevolmente la vita usando ad esempio:

JavaScript:
  1. document.observe("dom:loaded",
  2.     function() {
  3.         var script = new Element("script", { type: "text/javascript", src: "/js/altro.js" });
  4.         $$("head")[0].insert(script);
  5.     }
  6. );

Dopo che la pagina è stata caricata (document.observe) viene aggiunto un nuovo script Javascript! Per gli stili vale esattamente la stessa cosa!

Post correlati

Unobtrusive Javascript: un po’ di chiarezza e occhio agli impostori

Domenica 13 Aprile, 2008

Alcuni script, ed alcuni Web, usano alcune funzioni Javascript spacciandole per non-intrusive (Unobtrusive), anche quando non lo sono affatto. Cosa rende uno script (solitamente Javascript) non intrusivo? In  linea di principio uno script Javascript è non-intrusivo quando si può far a meno di esso! Detto molto semplicemente! Nello sviluppo di un sito Web l'usabilità dello stesso non deve dipendere da nessun tipo di script. Solo in questo caso abbiamo un genuino script Unobtrusive. Continua a leggere... »

Post correlati

Shadowbox assetURL: impostare il percorso delle immagini

Sabato 12 Aprile, 2008

Quando Shadowbox apre la sua finestra per mostrare un contenuto (immagine, iframe, Movie, ecc...), visualizza, nell'attesa, un gif animato che viene fornito nel pacchetto. Se la pagina che sta utilizzando Shadowbox si trova allo stesso livello della cartella images, tutto funziona bene. Per default, infatti, Shadowbox cerca la gif animata sotto images/loading.gif - o images/loading-light.gif se avete scelto gli stili light (shadowbox-light.css). Altrimenti, e spesso c'è il rischio anche di non accorgesene, se ci troviamo in una diversa alberatura, viene generato un bel codice 404 - di pagina non travata; nel nostro caso di file non trovato!

Per risolvere il problema basta inizializzare Shadowbox con un parametro opportuno che indica proprio il percorso assoluto della cartella images: su undolog.com, ad esempio, ho posizionato la gif animata del loading direttamente nella cartella images presente in root (come circa un miliardo di altri siti :). Per rendere accessibile questa cartella a Shadowbox, a prescindere dal percorso, ho inserito semplicemenete:

JavaScript:
  1. // init shadowbox with assetURL parameter
  2. Shadowbox.init( {assetURL: 'http://www.undolog.com/' } );

Post correlati