如何处理GWT主题CSS文件的缓存

如何处理GWT主题CSS文件的缓存,css,gwt,caching,themes,Css,Gwt,Caching,Themes,我有一个用Struts/Tiles/JSP编写的应用程序,我正在向其中添加一个GWT应用程序。我的应用程序的非GWT部分通过实际写入css文件来处理css缓存,该文件附带了从我的svn存储库中获取的版本号,如“style.css?svnbuild=12345”。这样,我就可以告诉浏览器永远缓存那些css文件,当我部署新版本时,我的所有用户都会立即下载 现在我转到GWT应用程序,我喜欢它使用“longmd5sum.cache.css”作为文件名,这样我仍然可以告诉浏览器永远缓存它。问题是与我的主题

我有一个用Struts/Tiles/JSP编写的应用程序,我正在向其中添加一个GWT应用程序。我的应用程序的非GWT部分通过实际写入css文件来处理css缓存,该文件附带了从我的svn存储库中获取的版本号,如“style.css?svnbuild=12345”。这样,我就可以告诉浏览器永远缓存那些css文件,当我部署新版本时,我的所有用户都会立即下载

现在我转到GWT应用程序,我喜欢它使用“longmd5sum.cache.css”作为文件名,这样我仍然可以告诉浏览器永远缓存它。问题是与我的主题相关联的css文件,如“gwt standard.css”,没有强名称,也没有附加我的svnbuild参数。每当我部署新版本的应用程序时,用户仍然会看到旧版本的css,这使得它看起来是错误的


有人想出了处理gwt主题css文件缓存的最佳实践吗?在将css附加到文档时,有没有一种方法可以附加svnbuild参数或类似的内容?

好的。所以在我发布这篇文章之后,我深入研究了GWT源代码,找到了一些关于创建GWT自定义链接器的链接

下面是我如何用自己的链接器解决的。首先,我创建了一个链接器类,它扩展了标准IFrameLinker:

@LinkerOrder(LinkerOrder.Order.PRIMARY)
public class MyLinker extends IFrameLinker {
    protected String generateStylesheetInjector(String stylesheetUrl) {
        stylesheetUrl = stylesheetUrl + "?buildtime=" + System.currentTimeMillis();
        return super.generateStylesheetInjector(stylesheetUrl);
    }
}
之后,只需告诉模块使用自定义链接器。在module.gwt.xml文件中:

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


刚刚试用过,现在在我的nocache.js文件中,每次编译时它都会输出一个新的时间戳。我的用户可以永久缓存css文件,每当我部署新版本的应用程序时,他们都会自动下载一个新的css文件。

现在最好使用ClientBundle,而不是单独使用css: . 最近,我们通过以下内容轻松地完成了这一转换(显然,未来我们会消除@CssResource.NotStrict注释):

然后在应用程序的根目录中:

private void injectAllCss() {
        OurCssResources resources = GWT.create(OurCssResources.class);
        resources.getCss().ensureInjected();
...
这是一种严厉的方法,但它解决了问题,让你走上了谷歌预期的道路


看起来你可以更接近他们的预期方式(虽然我没有在2.4上尝试过这些,但我上面提到的东西在2.4下确实有效(我确实遇到了外部依赖(GXT)的问题);但由于这一点不会改变,我只是使用老式方法将其保留下来。

提供的解决方案在GWT2.4上已经无效。您能推荐一个新的吗?
private void injectAllCss() {
        OurCssResources resources = GWT.create(OurCssResources.class);
        resources.getCss().ensureInjected();
...