2012-09-29 48 views
2

我想更好地理解GWT ClientBundle和緩存的使用。GWT ClientBundle緩存如何工作?

如果我有一個大的文本文件,例如,我想提供給我的客戶,我可以使用

public interface MyResources extends ClientBundle { 
    public static final MyResources INSTANCE = GWT.create(MyResources.class);  
     @Source("myText.txt") 
     public TextResource myText(); 
} 
//-- then later to use the text 
String text = MyResources.INSTANCE.myText().getText(); 

這是否意味着該文件「myText.txt」將是從客戶端第一次運行應用程序時從服務器下載,然後該文件將存儲在瀏覽器的緩存中,以便將來使用該應用程序時,該文件不需要被下載?

如果是這樣,如果我更改「myText.txt」會發生什麼情況,應用程序是否知道獲取新版本?

最後,如果文件確實存儲在緩存中,那麼這與HTML5中的本地存儲有何不同?

謝謝。

+0

與HTML5存儲的區別在於,用於客戶端捆綁資源等的緩存純粹是HTTP資源的標準瀏覽器緩存,它基於URL和HTTP緩存頭自動緩存,而您將管理進入HTML5的內容存儲自己的應用程序。 –

回答

5
  • 正如丹尼爾Kurka已經提到的,資源可以在js文件內聯(一*.cache.*文件),其中GWT編譯代碼的其餘部分生活。
  • 客戶端軟件包中的所有資源都不會發生內聯。例如。大圖像不會內聯,也可以通過@ImageOptions.preventInlining()來防止,而對於ExternalTextResources則不會發生。

什麼,對於兩種情況是常見的是,該結果將在*.cache.*文件,與自動改變唯一的名字,每當源文件更改的內容(你必須雖然重新編譯GWT應用程序!)

這允許服務器通過appropriate caching HTTP headers傳遞這些文件(您必須自己設置它!)對於客戶端而言,這意味着它不僅能夠緩存內容(它無論如何都會緩存,即使這些頭文件沒有設置),但它甚至可以跳過詢問服務器,如果存在更新的版本。

ClientBundles的一大優點是,文件名會自動更改。最大的缺點是,你的必須重新編譯你的GWT應用程序,當資源發生變化時。如果你不想這樣做,那麼最好使用其他一些方法來加載文件:你仍然可以讓瀏覽器緩存你喜歡的任何文件(通過設置HTTP標頭),但是你必須小心手動給他們一個新的名字,當內容改變時。

3

位於clientbundle內部的文件會內嵌到您編譯的javascript中。他們不會單獨下載。如果您想在特定時間下載資源,則可以輕鬆使用請求構建器。

如果您不想立即下載文件,但仍想要內嵌文​​件,則可以使用代碼拆分並將該包放入應用程序的另一部分。

+0

謝謝丹尼爾。因此,如果我的客戶端軟件包中有100MB大文件,每次用戶啓動應用程序時都必須下載(作爲編譯後的JavaScript的一部分)?我認爲ClientBundle的重點是利用緩存? – aez

+0

clientbundle不是關於緩存,它關於直接在你的javascript(將被緩存)中的資源,但一個100 MB的資源不適合clientbundle(而不是下載以及...)將其與服務分離來電! –

+0

谷歌網站說:「部署的GWT應用程序中的資源可以大致分爲永不緩存(.nocache.js),永久緩存(.cache.html)和其他所有內容(myapp.css)的資源。ClientBundle接口將條目從所有其他類別移入永久緩存類別中。「所以對我來說聽起來像ClientBundle確實使用「緩存」,無論是什麼。這是否會改變你的想法丹尼爾? – aez

4

如果您希望按需加載而不是作爲編譯JavaScript的一部分,則應該使用外部文本資源。

https://developers.google.com/web-toolkit/doc/latest/DevGuideClientBundle#TextResource

如果用戶需要將整個文件,使用一個文本資源。如果用戶需要它的一部分,請將此文件拆分爲更小的文件:只有需要的文件將在需要時加載。

外部文本資源可像所有其他靜態文件一樣進行緩存。

+0

謝謝安德烈。你能解釋一下「像所有其他靜態文件一樣,可以緩存」外部文本資源「的含義嗎?我希望能夠實現這樣一種情況,即只需下載一次大文件,然後以某種方式將它們奇蹟般地存儲在「緩存」中,無論這種情況如何,以便將來調用該應用程序時不需要再次下載該文件。 ClientBundle會給我嗎? – aez

+0

有不同類型的ClientBundles。 ExternalTextResource可以滿足您的需求。允許瀏覽器緩存靜態文件取決於您使用的服務器。對於Apache,您啓用mod_expires。對於Appengine,您可以修改appengine-xml。等等。 –