2010-01-13 71 views
7

我有一個用Struts/Tiles/JSP編寫的應用程序,我正在添加一個GWT應用程序。我的應用程序的非GWT部分通過從附加的svn存儲庫中獲取版本號來實際寫出css文件來處理css緩存,如「styles.css?svnbuild = 12345」。這樣我可以告訴瀏覽器永遠緩存這些css文件,當我部署一個新版本時,所有用戶立即下載它。如何處理GWT主題CSS文件的緩存

現在我正在轉向GWT應用程序,我喜歡它如何使用「longmd5sum.cache.css」作爲文件名,所以我仍然可以告訴瀏覽器將其永久緩存。問題是與我的主題相關的css文件(如「gwt-standard.css」)沒有強名稱,也沒有附加我的svnbuild參數。每當我部署我的應用程序的新版本,用戶仍然看到舊版本的CSS,這使得它看起來不對。

有沒有人想出了處理gwt主題css文件緩存的最佳做法?在將css附加到文檔時,是否可以附加一個svnbuild參數或類似的方法?

+0

GWT2.4提供的解決方案已經沒用了,你能推薦一個新的解決方案嗎? – Hatter 2011-12-21 13:31:13

回答

10

好的。所以在我發佈這篇文章之後,我深入瞭解了GWT源代碼並發現了一些關於創建GWT自定義鏈接器的鏈接。

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

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

以下是我用我自己的連接器解決了這個問題。首先我做一個擴展標準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文件,每當我部署新版本的應用時,他們都會自動下載一個新文件。

2

似乎現在首選的做法是使用ClientBundles而不是單獨的CSS: Google Css Resource Cookbook

public interface OurCssResources extends ClientBundle { 

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

然後在我們的應用程序的根目錄:

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

這是我們最近用下面(有一些明顯的未來意圖消除@ CssResource.NotStrict註釋)做出這種轉變很怕疼這是一種沉重的手段,但它解決了這個問題,它讓你走上了谷歌想要的方式。

它看起來像你可以更接近他們的預期方式fairly automatically(雖然我沒有在2.4上試過這些,我上面提到的東西確實在2.4下工作(我確實有一個外部依賴(GXT) ;但由於這不會改變,我只是用舊的方法離開它