GWT ClientBundle缓存如何工作?

时间:2012-09-29 11:37:45

标签: 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中的本地存储有何不同?

感谢。

3 个答案:

答案 0 :(得分:5)

  • 正如Daniel Kurka已经提到的,资源可以在js文件(一个*.cache.*文件)中内联,其中包含其余编译的GWT代码。
  • 客户端捆绑包中的所有资源都不会进行内联。例如。大图像永远不会内联,也可以使用@ImageOptions.preventInlining()来防止它,而且对于ExternalTextResources也不会出现。

这两种情况的共同点是,结果将在*.cache.*个文件中,只要源文件的内容发生变化,就会自动更改唯一名称(您必须重新编译GWT应用程序!)

这允许服务器使用appropriate caching HTTP headers来传递这些文件(您必须自己设置它!)对于客户端,这意味着它不仅能够缓存内容(它会执行此操作)无论如何,即使没有设置这些标题,但它甚至可以跳过询问服务器,如果存在更新的版本。

ClientBundles的最大优点是文件名会自动更改。最大的缺点是,当资源发生变化时,必须重新编译您的GWT应用程序。如果您不想这样,那么最好使用其他方法来加载文件:您仍然可以让浏览器缓存您喜欢的任何文件(通过设置HTTP标头),但是您必须小心当内容发生变化时,手动给他们一个新名称。

答案 1 :(得分:4)

如果您希望按需加载外部文本资源而不是作为已编译JavaScript的一部分加载,则应使用外部文本资源。

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

如果您的用户需要整个文件,请使用一个文本资源。如果用户需要其中的一部分,请将此文件拆分为单独的较小文件:仅在需要时加载所请求的文件。

外部文本资源可以像所有其他静态文件一样进行缓存。

答案 2 :(得分:3)

clientbundle中的文件会被内联到您编译的javascript中。它们不会单独下载。如果要在给定时间下载资源,可以轻松地使用请求构建器。

如果您不想立即下载文件,但仍希望内联它,则可以使用代码拆分并将捆绑包放入应用程序的另一部分。