2011-08-30 12 views

risposta

4

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:

  1. Vai dashboard App Engine vostri progetti: https://appengine.google.com/settings?&app_id=s~your_project_id

  2. Fare clic su "Impostazioni applicazione" (in basso a sinistra la sezione "Amministrazione" sotto).

  3. 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

+2

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

4

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.

+0

Cosa c'è che non va nel minificare al volo? Se stai usando copie in cache, non vedo cosa c'è di sbagliato in questo metodo. –

+5

@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. –

1

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.

1

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.

2

è 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),...