3

我试图更好地理解 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 中的本地存储有何不同?

谢谢。

4

3 回答 3

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

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

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

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

于 2012-09-29T17:33:00.123 回答
4

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

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

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

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

于 2012-09-29T15:27:38.523 回答
3

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

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

于 2012-09-29T12:35:41.340 回答