Non sono riuscito a trovare alcuna soluzione adeguata per l'automazione del minisito CSS e Javascript di Google App Engine.Come automatizzare Javascript e CSS minification su Google App Engine?
risposta
Se i file JS/CSS devono essere utilizzati all'interno di una pagina HTML , quindi un'ottima opzione è far sì che App Engine ottimizzi automaticamente il tuo sito (minification, bundling, inlining e altro) tramite la funzione sperimentale "Pagina Speed". È possibile attivare questo su in questo modo:
Vai dashboard App Engine vostri progetti: https://appengine.google.com/settings?&app_id=s~your_project_id
Fare clic su "Impostazioni applicazione" (in basso a sinistra la sezione "Amministrazione" sotto).
Scorri verso il basso fino alla sezione "Prestazioni" e individua "Servizio Page Speed:". Seleziona la casella di controllo "Abilita servizio Page Speed" e premi "Salva".
Questo aggiungerà filtri di risposta che verrà automaticamente fare cose come combinare e minify tuoi JS, ruotare il fascio minified da un riferimento script per uno script in linea (al minore il conteggio di richieste al server) e più fresco e senza sforzo prestazioni migliorate. Per saperne di più su questa funzione: https://developers.google.com/speed/pagespeed/service/faq
Scrivere uno script di distribuzione che faccia una copia della tua app con JS e CSS minificati, quindi chiama appcfg su di esso. Non dovresti minimizzarlo in modo dinamico a meno che non lo stia generando dinamicamente.
Cosa c'è che non va nel minificare al volo? Se stai usando copie in cache, non vedo cosa c'è di sbagliato in questo metodo. –
@Ron Il tuo codice non sta cambiando, quindi non c'è motivo di minimizzare più e più volte. Gli utenti che hanno problemi con la cache vedranno una significativa latenza aggiuntiva, senza alcun reale vantaggio da parte tua. Spreca anche risorse. –
La risposta di Nick è il modo corretto per farlo, ma è possibile farlo al volo quando viene richiesto il JS/CSS, quindi impostare il controllo della cache su pubblico per memorizzare i risultati a monte.
- più sottile - http://pypi.python.org/pypi/slimmer/
- JSmin.py - http://code.google.com/p/v8/source/browse/branches/bleeding_edge/tools/jsmin.py
- Cache intestazione di controllo chiacchiere - http://groups.google.com/group/google-appengine/browse_thread/thread/be3fa7b5e170f378 e post del blog - http://www.kyle-jensen.com/proxy-caching-on-google-appengine
Si potrebbe provare una build-time o una soluzione runtime (usando il plugin maven) fornito da uno strumento chiamato wro4j
Disclaimer: questo è un progetto su cui sto lavorando.
Ho finito per creare questo script appengine (utilizza memcache e slimit). Ho trovato che lo slimit è il miglior script di minification, ma sto pensando di usare quello di Google.
è possibile automatizzare il processo abbastanza efficiente caricando il contenuto dello script in una stringa, il trattamento con JSMin e, infine, salvare e servire il risultato. Non preoccuparti delle prestazioni, esegui jsmin solo quando viene creata l'istanza dell'applicazione (certezza, non per ogni richiesta).
puoi afferrare jsmin.py here.
Diciamo che ho questa funzione che legge il JS dal filesystem (non compresso, versione di debug) e restituisce il suo contenuto di stringa nel modulo logger.py:
class ScriptManager():
def get_javascript(self):
path_to_js = os.path.join(os.path.dirname(__file__), 'js/script.js')
return file(path_to_js,'rb').read()
processo finita JSMin. assicurati di utilizzare le intestazioni di cache appropriate. prendere questo modulo campione jsrendered come examp
js_compressed =
jsmin.jsmin(scripts.logger.ScriptManager().get_javascript())
JS_CACHE_FOR_DAYS = 30
class scriptjs(webapp2.RequestHandler):
def get(self):
self.response.headers['Content-Type'] = 'text/javascript'
expires_date = datetime.datetime.utcnow() + datetime.timedelta(JS_CACHE_FOR_DAYS)
expires_str = expires_date.strftime('%d %b %Y %H:%M:%S GMT')
self.response.headers.add_header('Expires', expires_str)
self.response.headers['Cache-Control'] = 'public'
self.response.cache_control.no_cache = None
self.response.out.write(js_compressed)
ora tornare che da un gestore Contnet dinamica nella vostra main.py:
app = webapp2.WSGIApplication([
('/scripts/script.js', jsrender.scriptjs),...
Purtroppo questa soluzione non funzionerà più dopo il 1 ° dicembre 2015, poiché il servizio Page Speed per Google App Engine è stato disattivato. Come indicato nella [documentazione di App Engine] (https://cloud.google.com/appengine/docs/deprecations/pagespeed): [...] il servizio PageSpeed per Google App Engine è deprecato e sarà disattivato il 1 ° dicembre 2015. L'integrazione di PageSpeed su Google App Engine continuerà a funzionare fino al 1 ° dicembre 2015, dopodiché le ottimizzazioni di PageSpeed non saranno più applicate alla tua app. – matangover