2013-06-20 11 views
6

Dal webassets won't work on GAE per comprimere un js/css al volo, sembra che l'approccio migliore sia farlo al momento dell'implementazione.Come ridurre e versione js/css su Google App Engine?

Dopo un sacco di googling ho trovato la sceneggiatura qui sotto per raggiungere questo obiettivo.

All'inizio pensavo che il migliore sarebbe stato lasciare il percorso javascript in base.html così com'è e semplicemente comprimere il css/js.

cssmin comprime il css e sovrascrive l'originale. Tuttavia la chiusura non consente di sovrascrivere l'originale e questo concetto ha già esito negativo.

Il secondo problema è, anche se ho ottenuto la chiusura sovrascrivendo il file originale, il caching sarà un problema. Per questo motivo, ogni distribuzione di css/js minificati dovrebbe avere un numero casuale nel nome del file, in modo che le nuove versioni vengano effettivamente rilevate dopo una nuova distribuzione. Con il concetto che ho ideato, questo non sarà possibile però.

Quindi l'unico modo per ottenere questo sarebbe modificare base.html con sed o qualcosa del genere.

Prima di reinventare la ruota, c'è un approccio migliore per farlo? Molte grazie

import sys, os 
import cssmin 

def main(): 
    if len(sys.argv) == 1: 
     return 

    appId = sys.argv[1] 
    print "appId", appId 

    cmd = r'java -jar compiler.jar --js=/src/application/static/f11/f11.js --js_output_file=/src/application/static/f11/f11.min.js' 
    os.system(cmd) 

    output = cssmin.cssmin(open('/src/application/static/f11/f11.css').read()) 
    f = open('/src/application/static/f11/f11.css','w') 
    f.write(output)  

    # Perform appcfg.py to update GAE server 
    cmd = r'"\google_appengine\appcfg.py"' 
    os.system(cmd + " update . " + " -A %s"%appId) 


if __name__ == "__main__": 
    main() 
+0

C'è un motivo specifico per non comprimere css/js con strumenti da riga di comando e quindi avere un piccolo script bash per gestire la procedura di distribuzione? Il mio script di distribuzione consiste sia nel minificare il css/js che uso sia nell'eseguire il comando 'appcfg'. – dlebech

+0

In fase di sviluppo sono necessari gli asset non compressi e per la produzione sono necessari compressi. Modifica manualmente il percorso delle risorse da .js a .min.js manualmente? E come gestisci il controllo delle versioni? – Houman

+0

Ho [condiviso i miei script di implementazione/sviluppo qui] (https://gist.github.com/dlebech/5846132). Nel mio html, faccio sempre riferimento ai file .min.js e poi ho uno script per lo sviluppo (run_debug.sh) e uno per la distribuzione (deploy.sh). Entrambi usano lo script compile.sh che si trova nella mia cartella statica. O copia semplicemente lo sviluppo css/js nel file .min o esegue la minificazione effettiva. Non so se questo sia utile, ma almeno è come lo faccio funzionare :-) – dlebech

risposta

1

Si dovrebbe fare una rilevazione di una volta su istanza di avvio che stabilisce alcune vars globali a seconda se la vostra applicazione è in esecuzione sul server dev. Si generano gli URL necessari per le risorse in base a ciò e si dispone di un elenco di versioni per ciascun asset.

esempio python (full context):

JQUERY_VERSION = '1.7.2' 
JQUERY_UI_VERSION = '1.8.20' 
ANGULAR_VERSION = '1.0.2' 

if os.environ['SERVER_SOFTWARE'].startswith('Google'): 
    JQUERY_URL = "//ajax.googleapis.com/ajax/libs/jquery/%(version)s/jquery.min.js" %{ 'version': JQUERY_VERSION } 
    JQUERY_UI_URL = "//ajax.googleapis.com/ajax/libs/jqueryui/%(version)s/jquery-ui.min.js" %{ 'version': JQUERY_UI_VERSION } 
    JQUERY_UI_CSS_URL = "//ajax.googleapis.com/ajax/libs/jqueryui/%(version)s/themes/base/jquery.ui.all.css" %{ 'version': JQUERY_UI_VERSION } 
    ANGULAR_URL = "//ajax.googleapis.com/ajax/libs/angularjs/%(version)s/angular.min.js" %{ 'version': ANGULAR_VERSION } 
else: 
    JQUERY_URL = "/static/js/jquery-%(version)s.min.js" %{ 'version': JQUERY_VERSION } 
    JQUERY_UI_URL = "/static/js/jquery-ui-%(version)s.min.js" %{ 'version': JQUERY_UI_VERSION } 
    JQUERY_UI_CSS_URL = "/static/css/jquery-ui/jquery-ui-%(version)s.css" %{ 'version': JQUERY_UI_VERSION } 
    ANGULAR_URL = "/static/js/angular-%(version)s.min.js" %{ 'version': ANGULAR_VERSION } 

andare esempio (full context):

func init() { 
    angular_ver := "1.0.5" 
    bootstrap_ver := "2.3.1" 
    jquery_ver := "1.9.1" 

    if appengine.IsDevAppServer() { 
     Angular = fmt.Sprintf("/static/js/angular-%v.js", angular_ver) 
     BootstrapCss = fmt.Sprintf("/static/css/bootstrap-%v.css", bootstrap_ver) 
     BootstrapJs = fmt.Sprintf("/static/js/bootstrap-%v.js", bootstrap_ver) 
     Jquery = fmt.Sprintf("/static/js/jquery-%v.js", jquery_ver) 
    } else { 
     Angular = fmt.Sprintf("//ajax.googleapis.com/ajax/libs/angularjs/%v/angular.min.js", angular_ver) 
     BootstrapCss = fmt.Sprintf("//netdna.bootstrapcdn.com/twitter-bootstrap/%v/css/bootstrap-combined.min.css", bootstrap_ver) 
     BootstrapJs = fmt.Sprintf("//netdna.bootstrapcdn.com/twitter-bootstrap/%v/js/bootstrap.min.js", bootstrap_ver) 
     Jquery = fmt.Sprintf("//ajax.googleapis.com/ajax/libs/jquery/%v/jquery.min.js", jquery_ver) 
    } 
} 

Se si dispone di uno stript distribuire l'minifies vostro locale (cioè, non CDN) di contenuti, percorso che qui, e usa il metodo sopra, ma con un URL locale con estensione min.