2

考虑以下问题。您希望为您的 GWT 项目提供离线清单/应用程序缓存文件。在这种情况下,有两个问题:

  1. GWT 生成不同排列的 js 文件(取决于浏览器版本)。加载应用程序时,一些 GWT javascript 代码使用您的用户代理属性来包含适当的属性。您需要为这些排列中的每一个生成一个不同的清单文件,因为您不想缓存您不会使用的文件(这些文件每个排列可能约为 0.5MB)。MGWT Manifest Linker涵盖了这个问题,它在编译过程中生成不同的清单文件
  2. 在浏览器中加载 webapp 时提供适当的清单文件

这个问题与问题 2 相关。我们如何以稳健的方式动态地为这个清单提供服务?MGWT 使用服务于清单的servlet,这取决于请求中的用户代理。您需要将您的用户代理字符串(例如Mozilla/4.0 (compatible; MSIE 6.0b; Windows NT 5.1))映射到“用户代理ID”(例如ie6)。使用 MGWT 链接器创建的映射文件,您可以找到提供给客户端的清单文件。一个主要的缺点是您需要执行一些简单的字符串操作来将完整的用户代理字符串映射到这个用户代理 id,并进行一些简单的字符串匹配。您将无法为此类映射重用客户端 GWT 代码。(这一切都在本主题中讨论)。因此,每当 GWT 收到更改排列数量和/或支持的浏览器的更新时,您也需要更改 servlet 代码。换句话说:这不是一个强大的解决方案。

问题是:我们可以通过在客户端动态地提供这些文件,以不同的方式为这些 GWT 排列提供清单吗?

4

2 回答 2

1

是的,但是以一种全面的方式。无法通过 javascript 动态更改 html 'manifest' 属性。一种解决方法是通过 javascript 生成一个 iframe,它引用一个空的 html 页面,其中包含某个清单属性(请参阅本主题)。为了在 GWT 中工作,您需要:

  1. 更改 MGWT 链接器,因此对于每个排列,您将创建一个空的 html 页面,并引用此排列清单。就像是:

    toReturn.add(emitString(
            logger, 
            "<html manifest=\"" + permutation + ".manifest\"><head></head><body></body></html>", 
            permutation + ".manifest.html")
    );
    
  2. 在您的 GWT 客户端代码中,在模块加载时:检索您的排列强名称,并使用它来插入此排列的 iframe。这看起来像这样:

在您的入门课程中:

public void onModuleLoad() {
    appendManifestIframe(GWT.getPermutationStrongName() + ".manifest.html");
}

public static native void appendManifestIframe(String manifestIframe) /*-{
        var ifrm = document.createElement("iframe"); 
        ifrm.setAttribute("src", manifestIframe); 
        ifrm.style.width = 0+"px"; 
        ifrm.style.height = 0+"px"; 
        $doc.body.appendChild(ifrm); 
    }-*/;

请注意,GWT.getPermutationStrongName当您处于开发模式时会返回“HostedMode”。即,你将无法在开发模式下使用这种方法(或者你应该确保你也编写了一个单独的清单/iframe HostedMode

于 2013-09-10T14:40:55.000 回答
0

我对在客户端计算要使用的清单文件的方法并不积极。让我解释:

manifest 属性告诉浏览器该页面以及清单中包含并由该页面使用的所有资产必须被缓存并从缓存中获取。

如果您没有在 index.html 中设置 manifest 属性,页面将不会被缓存,也不会使用缓存中的任何资源。

使用 iframe 方法,您将加载带有 manifest 属性集的 iframe.html,并且此清单将包含 index.html 及其所有资产。

我没有对此进行测试,但我认为虽然浏览器会缓存并从离线存储中获取 index.html,但由于 index.html 没有设置清单属性,因此它不会获取包含在其中的任何资产,所以你的模块如果设备离线,.nocache.js 将永远不会被加载。

于 2013-09-11T20:57:09.277 回答