2010-01-13 12 views
7

Tengo una aplicación escrita con Struts/Tiles/JSP a la que agrego una aplicación GWT. La parte no GWT de mi aplicación maneja el almacenamiento en caché css escribiendo realmente el archivo css con un número de versión tomado de mi repositorio svn adjunto, como este "styles.css? Svnbuild = 12345". De esa forma puedo decirle al navegador que guarde en caché esos archivos css para siempre y cuando despliegue una nueva versión, todos mis usuarios la descargarán de inmediato.Cómo manejar el almacenamiento en caché de los archivos CSS del tema GWT

Ahora me estoy moviendo a la aplicación GWT y me encanta cómo utiliza "longmd5sum.cache.css" como el nombre del archivo, así que aún puedo decirle al navegador que lo guarde en la memoria caché para siempre. El problema es que los archivos css asociados con mi tema, como "gwt-standard.css", no tienen un nombre fuerte y no tienen adjunto mi parámetro svnbuild. Cada vez que despliego una nueva versión de mi aplicación, los usuarios siguen viendo la versión anterior del css, lo que hace que se vea mal.

¿Alguien ha descubierto una mejor práctica para manejar el almacenamiento en caché de los archivos gwt theme css? ¿Hay alguna manera de agregar un parámetro svnbuild o algo similar al agregar el CSS al documento?

+0

La solución provista ya es inútil en GWT2.4. ¿Puede sugerir una nueva? – Hatter

Respuesta

10

Ok. Así que después de publicar esto busqué en el código fuente de GWT y encontré algunos enlaces sobre cómo crear un enlazador personalizado de GWT.

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

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

Así es como lo resolví con mi propio enlazador. Primero hice una clase enlazador que se extiende la IFrameLinker estándar:

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

Después de que es sólo una cuestión de hablar con su módulo de utilizar su enlazador personalizado. En el archivo de module.gwt.xml:

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

Sólo probé y ahora en mi archivo nocache.js se da salida a una nueva marca de tiempo cada vez que compilar. Mis usuarios pueden almacenar en caché el archivo css para siempre y descargarán uno nuevo cada vez que implemente una nueva versión de la aplicación.

2

Parece que lo mejor que se puede hacer ahora es usar ClientBundles en lugar de separar CSS: Google Css Resource Cookbook . Recientemente hemos hecho esta transición practicamente sin miedo con la siguiente (con, obviamente, algunos de intenciones para eliminar la anotación @ CssResource.NotStrict):

public interface OurCssResources extends ClientBundle { 

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

Luego, en la raíz de nuestra aplicación:

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

Este es una especie de enfoque de mano dura, pero resuelve el problema, y ​​te pone en el camino de hacer las cosas de la manera prevista de google.

Parece que puede acercarse aún más a su forma prevista fairly automatically (aunque no he probado esto en 2.4, lo que mencioné anteriormente sí funcionaba en 2.4 (tuve un problema con una dependencia externa (GXT) ; pero como eso no cambia, lo dejé usando el método antiguo.

Cuestiones relacionadas