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

谢谢。

有帮助吗?

解决方案

  • 正如 Daniel Kurka 已经提到的,资源可以内联到 js 文件中(a *.cache.* 文件),已编译的 GWT 代码的其余部分位于其中。
  • 客户端捆绑包中的所有资源不会发生内联。例如。大图像永远不会内联,也可以通过以下方法来防止 @ImageOptions.preventInlining(), ,并且对于ExternalTextResources 不会发生这种情况。

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

这允许服务器传递这些文件 适当的缓存 HTTP 标头 (你必须自己设置它!)对于客户端来说,这意味着它不仅能够缓存内容(无论如何,即使没有设置这些标头,它也会这样做),而且它甚至可以跳过询问服务器是否存在更新版本。

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

其他提示

如果要按需加载,则应使用外部文本资源而不是编译的JavaScript的一部分。

https://developers.google.com/web-toolkit/doc / nimal / devguideclientbundle#textresource

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

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

客户端栏中的文件会在编译的javascript中加入。它们不会单独下载。如果要在给定时间下载资源,可以轻松使用Request Builder for。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top