2

次の問題を考えてみましょう。GWT プロジェクトのオフライン マニフェスト/appcache ファイルを提供したいと考えています。このような場合、次の 2 つの問題があります。

  1. GWT は、(ブラウザーのバージョンに応じて) js ファイルのさまざまな順列を生成します。アプリケーションをロードするとき、一部の GWT JavaScript コードはユーザー エージェント プロパティを使用して適切なプロパティを含めます。使用しないファイルをキャッシュしたくないため、これらの順列ごとに異なるマニフェスト ファイルを生成する必要があります (これらのファイルは順列ごとに約 0.5MB になる可能性があります)。この問題は、コンパイル プロセス中にさまざまなマニフェスト ファイルを生成するMGWT Manifest Linkerによってカバーされます。
  2. ブラウザーで webapp をロードするときに適切なマニフェスト ファイルを提供する

この質問は問題 2 に関連しています。このマニフェストを堅牢な方法で動的に提供するにはどうすればよいですか? MGWT は、要求からのユーザー エージェントに応じて、マニフェストを提供するサーブレットを使用します。Mozilla/4.0 (compatible; MSIE 6.0b; Windows NT 5.1)ユーザー エージェント文字列 (例: ) を「ユーザー エージェント ID」 (例: )にマップする必要がありますie6。MGWT リンカーによって作成されたマッピング ファイルを使用して、クライアントに提供するマニフェスト ファイルを見つけることができます。主な欠点は、完全なユーザー エージェント文字列をこのユーザー エージェント ID に単純な文字列マッチングでマップするために、簡単な文字列操作を行う必要があることです。このようなマッピングにクライアント側の GWT コードを再利用することはできません。(これはすべてこのトピックで説明されています)。その結果、順列の数やサポートされているブラウザーを変更する更新を GWT が受け取るたびに、サーブレット コードも変更する必要があります。つまり、これは堅牢なソリューションではありません。

問題は、クライアント側でこれらのファイルを動的に提供することによって、これらの GWT 順列に対して別の方法でマニフェストを提供できるかということです。

4

2 に答える 2

1

はい、ただしラウンドビット方式で。javascript を使用して html の「マニフェスト」属性を動的に変更することはできません。回避策は、javascript を介して iframe を生成することです。この 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」を返すことに注意してください。つまり、開発モードではこのアプローチを使用できません (または、別のマニフェスト/iframeHostedModeも同様に作成する必要があります) 。

于 2013-09-10T14:40:55.000 に答える
0

クライアント側で使用するマニフェスト ファイルを計算するアプローチについては、私は肯定的ではありません。説明させてください:

マニフェスト属性は、このページと、マニフェストに含まれ、このページで使用されるすべてのアセットをキャッシュし、キャッシュから取得する必要があることをブラウザに伝えます。

index.html でマニフェスト属性を設定しない場合、ページはキャッシュされず、キャッシュからのリソースは使用されません。

iframe アプローチを使用すると、マニフェスト属性が設定された iframe.html をロードすると、このマニフェストに index.html とそのすべてのアセットが含まれます。

私はこれをテストしていませんが、ブラウザーはオフライン ストレージから index.html をキャッシュして取得しますが、index.html にはマニフェスト属性が設定されていないため、そこに含まれるアセットを取得しないと思います。デバイスがオフラインの場合、.nocache.js は読み込まれません。

于 2013-09-11T20:57:09.277 に答える