GWT ClientBundle缓存如何工作?

aez*_*aez 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(); 
Run Code Online (Sandbox Code Playgroud)

这是否意味着在客户端第一次运行应用程序时将从服务器下载文件"myText.txt",然后该文件将存储在浏览器的缓存中,以便在将来使用该应用程序时,该文件不会需要下载?

如果是这样,如果我更改"myText.txt"会发生什么,应用程序是否知道获取新版本?

最后,如果文件确实存储在缓存中,那么这与HTML5中的本地存储有何不同?

谢谢.

Chr*_*her 5

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

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

这允许服务器使用适当的缓存HTTP头传递这些文件(你必须自己设置它!)对于客户端,这意味着它不仅能够缓存内容(无论如何,即使那些标题没有设置),但它甚至可以跳过询问服务器,如果存在更新的版本.

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