2010-01-13 6 views
7

Ho un'app scritta con Struts/Tiles/JSP a cui sto aggiungendo un'app GWT. La parte non GWT della mia app gestisce il css caching scrivendo effettivamente il file css con un numero di versione preso dal mio repository svn allegato, come questo "styles.css? Svnbuild = 12345". In questo modo posso dire al browser di memorizzare i file css per sempre e quando distribuisco una nuova versione, tutti i miei utenti lo scaricano immediatamente.Come gestire la memorizzazione nella cache del tema GWT File CSS

Ora mi sto spostando verso l'app GWT e mi piace come usa "longmd5sum.cache.css" come nome file, quindi posso ancora dire al browser di memorizzarlo per sempre. Il problema è che i file CSS associati al mio tema, come "gwt-standard.css", non hanno un nome sicuro e non hanno il mio parametro svnbuild allegato. Ogni volta che distribuisco una nuova versione della mia app, gli utenti continuano a vedere la vecchia versione del css che lo fa sembrare sbagliato.

Qualcuno ha trovato una soluzione ottimale per gestire la memorizzazione nella cache dei file CSS di tema gwt? C'è un modo per aggiungere un parametro svnbuild o qualcosa di simile quando si aggiunge il css al documento?

+0

La soluzione fornita è già inutile su GWT2.4. Puoi suggerirne una nuova? – Hatter

risposta

10

Ok. Quindi, dopo averlo postato, ho individuato il codice sorgente GWT e ho trovato alcuni collegamenti sulla creazione di un linker GWT personalizzato.

http://development.lombardi.com/?p=29

http://code.google.com/webtoolkit/doc/1.6/DevGuideOrganizingProjects.html

Ecco come ho risolto con la mia linker. In primo luogo ho fatto una classe linker che estende l'IFrameLinker di serie:

@LinkerOrder(LinkerOrder.Order.PRIMARY) 
public class MyLinker extends IFrameLinker { 
    protected String generateStylesheetInjector(String stylesheetUrl) { 
     stylesheetUrl = stylesheetUrl + "?buildtime=" + System.currentTimeMillis(); 
     return super.generateStylesheetInjector(stylesheetUrl); 
    } 
} 

Dopo di che è solo una questione di dire al vostro modulo di utilizzare il linker personalizzato. Nel file module.gwt.xml:

<module> 
    <define-linker name="mylinker" class="com.company.gwt.core.linker.MyLinker" /> 
    <add-linker name="mylinker" /> 
</module> 

appena provato fuori e ora nel mio file nocache.js viene emesso un nuovo timestamp ogni volta che compilo. I miei utenti possono memorizzare per sempre il file css e scaricarne uno nuovo automaticamente ogni volta che distribuisco una nuova versione dell'app.

2

Sembra che la cosa preferita da fare ora sia utilizzare ClientBundles piuttosto che CSS separati: Google Css Resource Cookbook . Recentemente abbiamo fatto questa transizione abbastanza indolore con il seguente (con ovviamente qualche futuro intento di eliminare l'annotazione @ CssResource.NotStrict):

public interface OurCssResources extends ClientBundle { 

    @Source("ourCSS.css") 
    @CssResource.NotStrict 
    public CssResource getCss(); 
... 

Poi nella radice della nostra applicazione:

private void injectAllCss() { 
     OurCssResources resources = GWT.create(OurCssResources.class); 
     resources.getCss().ensureInjected(); 
... 

Questo è una sorta di approccio pesante, ma risolve il problema, e ti mette sulla strada per fare cose che il google inteso modo.

Sembra che tu possa avvicinarti ancora di più al loro modo previsto fairly automatically (anche se non li ho provati su 2.4, le cose che ho menzionato sopra funzionano a meno di 2.4 (ho avuto un problema con una dipendenza esterna (GXT) ma dal momento che non cambierà, l'ho appena lasciato usando il metodo vecchio stile

Problemi correlati