際際滷 proiettate al GTUG *Google Technologies User Group) Palermo relative al tool Google Closure
1 of 35
Download to read offline
More Related Content
Closure Visto Da Vicino
1. Google Closure visto da vicino
Davide Ficano
davide.ficano@gmail.com
GTUG, Palermo, Gennaio, 2010
2. Google, API e licenze
Ogni applicazione rilasciata da Google e'
accessibile tramite API
Quasi tutte le applicazioni dispongono di API
pubbliche e documentate
Le API generalmente non hanno licenze open
source
3. Google Closure
Nel Novembre 2009 Google presenta Closure
E' Open Source (Apache license 2.0)
Contiene gli stessi strumenti utilizzati per
sviluppare le applicazioni Google
4. Cosa fa Closure
Lo sviluppo di applicazioni Enterprise lato client rende
difficoltoso
gestire la dipendenza tra moduli JS
ottimizzare il codice prodotto
gestire la generazione dinamica delle pagine
5. Quali strumenti
Closure e' composto da tre elementi, ognuno dei
quali e' utilizzabile indipendente dall'altro
Closure Library
Closure Compiler
Closure Template
6. Closure Library
Javascript Standard Library
Il sogno di una STL/JDK anche per Javascript
Concentrare le energie sullo sviluppo dell'applicazione e
non sui task ripetitivi
Server agnostic, deploy della libreria in modo semplice
Cross browser compatibile, sempre lo stesso problema
7. Closure Library
cosa contiene
Contiene centinaia di classi che coprono le piu' disparate
aree
goog.dom.*
goog.json.*
goog.css.*
goog.net.*
goog.graphics.* (HTML5 canvas)
8. Closure Library
il valore aggiunto
Il considerevole numero di classi fornite 竪
paradossalmente l'elemento meno interessante di
Closure Library.
Il vero valore aggiunto 竪 dato da
Alta leggibilit del codice scritto
Alta integrabilit con IDE
Documentazione ed esempi disponibili
Inclusione dinamica delle sole classi referenziate
Controllo delle dipendenze tra script
9. Closure Library
Inclusione dinamica
base.js
Ogni applicazione deve includere via tag <script/>
soltanto il file base.js
base.js rende disponibili due metodi(*)
goog.require(name)
goog.provide(name)
(*) Comprende anche altri metodi la cui trattazione non risulta pertinente in questo contesto
11. Closure Library
goog.provide()
//Presentiindom.js
Le classi definite in dom.js
goog.provide('goog.dom');
Vengono dichiarate tramite provide
goog.provide('goog.dom.DomHelper');
goog.provide('goog.dom.NodeType');
goog.require('goog.array');
...
...
Le classi da cui dom.js dipende
goog.require('goog.userAgent'); Vengono dichiarate tramite require
goog.dom.getDocument=function(){ returndocument; };
12. Closure Library
Gestione dipendenze
deps.js
base.js carica il file deps.js che contiene la lista di tutte
le dipendenze presenti in Library
deps.js contiene il mapping tra nome modulo e nome
file, le classi che fornisce e le classi da cui dipende
//require('goog.dom')
goog.addDependency('dom/dom.js', // percorso file
['goog.dom',...,'goog.dom.NodeType'], // classi fornite
['goog.array',..., 'goog.userAgent']); // classi richieste
13. Closure Library
Gestione dipendenze per i propri file
calcdeps.py
La scrittura di propri moduli conformi a Closure Library
richiede la creazione di un proprio deps.js
Nei file della distribuzione di Library e' presente lo script
Python calcdeps.py
calcdeps.py fa il parsing dei file sorgenti alla ricerca delle
dichiarazioni goog.require()/goog.provide() e crea un file
con l'albero delle dipendenze
14. Closure Library
documentazione e testing
Al suo interno Library usa strumenti diventati uno
standard de facto nella comunit Javascript.
JSDoc - http://code.google.com/p/jsdoc-toolkit/
JSUnit - http://www.jsunit.net/
15. Closure Compiler
Cosa non fa
Non produce codice macchina!
Cosa fa
Ottimizza il codice
Segnala errori e warning
Analizza le dipendenze at compile time
Offre strumenti di debug e test
16. Closure Compiler
come usarlo
E' possibile usare Compiler tramite
Applicazione Java a linea di comando
Facilita l'automazione di build process
Applicazione web
http://closure-compiler.appspot.com/home
API RESTful
17. Closure Compiler
ottimizzazioni
Sono disponibili tre livelli di ottimizzazione.
Ogni livello comprende le ottimizzazioni dei livelli inferiori
1.WHITESPACE_ONLY
Elimina gli spazi e gli a capo
2.SIMPLE_OPTIMIZATIONS
Il default, rinomina variabili locali e funzioni con nomi corti
3.ADVANCED_OPTIMIZATIONS
Effettua l'inline delle funzioni, molto aggressivo pu嘆 produrre
codice non funzionante se non si rispettano alcuni vincoli
20. Closure Compiler
Alla fiera delle follie dell'ottimizzatore 1
Si supponga di avere il costruttore
functionctor(){
this.name="";
}
Utilizzando il livello di ottimizzazione Simple tutto va bene
Utilizzando il livello Advanced invece...
21. Closure Compiler
Alla fiera delle follie dell'ottimizzatore 1
si ottiene un warning sull'uso globale di this.
Per compilare senza warning e' necessario dire, tramite
JSDoc, che la funzione e' un costruttore
/**
*@constructor
*/
functionctor(){
this.name="";
}
22. Closure Compiler
Alla fiera delle follie dell'ottimizzatore 2
Si supponga di avere il seguente frammento di codice
alert(typeoff);//print"undefined"
varf=function(){};
Utilizzando il livello di ottimizzazione Simple il codice
rimane inalterato
Utilizzando il livello Advanced invece...
23. Closure Compiler
Alla fiera delle follie dell'ottimizzatore 2
il frammento di codice
alert(typeoff);//print"undefined"
varf=function(){};
Viene trasformato in
alert(typeofa);//print"function"
functiona(){};
Contestualmente si ottiene un warning su f non definita
Viene stravolto il significato del codice originale!!!
24. Closure Compiler
Alla fiera delle follie dell'ottimizzatore 3
Si supponga di avere il seguente frammento di codice
functionf(a,b){
b=typeof(b)=="undefined"?1:b;
}
f(1);//alparametrobvienedatounvaloredidefault
Utilizzando il livello di ottimizzazione Simple il codice
generato risulta essere
functionf(){}f(1);
Utilizzando il livello Advanced invece...
25. Closure Compiler
Alla fiera delle follie dell'ottimizzatore 3
si ottiene un warning sulla mancanza di un valore per
b ma non c'e' nessun codice generato
La soluzione consiste nel dire, tramite JSDoc, che b e'
opzionale
/**
*@parama
*@param{string}[b="hello"]
*/
functionf(a,b){ }
f(1);
26. Closure Templates
Tofu e Soy
Closure Templates 竪 un sistema di templating che facilita
la scrittura di elementi di interfaccia utente dinamici
Nasce per creare frammenti di elementi grafici invece
di monolitici template per pagina
A tool, not a framework come riportato nella
documentazione ufficiale; "coabita" insieme ad altri
ambienti, librerie e framework
La sintassi del linguaggio SOY 竪 semplice ed intuitiva
e comprende i comuni costrutti di un linguaggio;
iterazione, espressioni condizionali
27. Closure Templates
Tofu e Soy
Lo stesso template pu嘆 essere utilizzato sia lato client
che server (Java)
I templates vengono compilati in codice Javascript
efficiente (SoyToJsSrcCompiler / SoyParseInfoGenerator )
Nessuna dipendenza da Compiler e Library,
l'integrazione con Library va esplicitamente attivata in
fase di compilazione (shouldProvideRequireSoyNamespaces)
Estendibile tramite plugin Java (come una tag library)
28. Closure Templates
Un esempio
/**
*Greetsapersonusing"Hello"bydefault.
*@paramnameThenameoftheperson.
*@param?greetingWordOptionalgreetingwordto
*useinsteadof"Hello".
*/
{template.helloName}
{ifnot$greetingWord}
Hello{$name}!
{else}
{$greetingWord}{$name}!
{/if}
{/template}
29. Tools
Integrazione Firebug
Closure Inspector viene utilizzata per debug e test
integration.
Attraverso dei file di source mapping (generati con
Compiler) permette di fare debug partendo dal codice
compilato
Mostra un migliore stack trace
Eseguendo le unit test mostra le assert che falliscono
Page Speed viene utilizzata per misurare tempi di
risposta di una pagina
Fornisce indicazioni su come ottimizzare la pagina
31. Conclusioni
Pro
E' Open Source
E' una libreria Javascript scritta da programmatori Java
package razionali e con bassa interdipendenza
Documentazione e supporto
Incoraggia l'utilizzo di good software engineering
practices
Documentare con JSDoc
Scrivere test unit con JSUnit
Closure Compiler generalmente migliore di YUI
Compressor
32. Conclusioni
Contro
E' una libreria Javascript scritta da programmatori Java
A discapito del nome, le closure Javascript sono
sottoutilizzate (vedi Jquery)
Troppe operazioni command line come calcdeps.py
L'ottimizzazione advanced e' inutilizzabile
Non esiste un CSS compiler