1

GWTコンパイラは、コード分割の結果として、コードの断片を生成フェッチトリガされません(詳細hereを参照)GWTのコードフラグメント(.cache.js)は、サービス労働者がイベント

最初のダウンロードファイルは、{英数字}と命名されます。 cache.js(例:1805B2053A824F148DB6D05B2186F955.cache.js)と他のフラグメント{number} .cache.js(例:1.cache.js)を下の図に示します。

GWT Code fragments

私はアプリはオフラインで作業したいとサービス労働者とGWTアプリケーションを開発しようとしています。一旦キャッシュされ、オフラインになると、最初のダウンロードファイルのGET要求はServiceWorkerのFETCHイベントをトリガーしますが、個々のコードフラグメントはイベントをトリガーしません。何らかの理由でサービスワーカーをバイパスしているように見えます。

デモンストレーションのために、https://gwt-pwa-demo.herokuapp.com/pwademo.htmlでアプリをチェックしてください。サービスワーカーを使用するGWTアプリです。それは私のアプリではない、私はデモンストレーションのためにそれを使用しています。

アプリケーションを読み込むと、すべてのファイルがキャッシュされます。いいえ、Chromeの開発ツールからオフラインになり、アプリを更新します。アプリがまだ表示され、Service Workerから最初のダウンロードファイルがロードされていることがわかります。ここで、Paris/Berlin/Londonをクリックして、フラグメント1.cache.jsなどをロードします。これらはディスクキャッシュからのものであり、ServiceWorkerによるキャッシュストレージではないことに注意してください。コンソール出力を見ると、ServiceWorker Fetchイベントから出力されるこれらのフラグメントのログは表示されません。

さらに明確にするために、アプリケーションはオフラインでしか動作しません。これは、フラグメントがディスクキャッシュから取得されるためです。これらのフラグメントがディスクキャッシュに存在しない場合、アプリケーションは動作しません。フラグメントがCache Storageに存在する場合でも、ServiceWorkerはこれらの要求をインターセプトできないため、ロードされません。これを実際に実行するには、次の手順に従います。

  1. アプリを一度読み込んだとすると、開発ツール - >アプリケーション - >ストレージのクリアとサイトデータのクリアを開いてください。キャッシュストレージ内のキャッシュもクリアされていることを確認してください。
  2. アプリをもう一度https://gwt-pwa-demo.herokuapp.com/pwademo.htmlに読み込みます。
  3. キャッシュが再度作成され、キャッシュにフラグメントが表示されます。
  4. デベロッパーツールが開いているときに、Chromeで「Empty Cache & Hard Reload」を使用してアプリをリロードします。
  5. これはディスクキャッシュをクリアしますが、キャッシュストレージはまだ存在します。
  6. オフラインにしてアプリを更新すると、最初のアプリがまだキャッシュストレージから読み込まれます。
  7. しかし、パリやロンドンをクリックするとコードフラグメントの読み込みが開始されますが、失敗します。

enter image description here

+0

GWTでも可能ですが、カスタムリンカーが必要です。おそらく、私は週末にはGithubのサンプルコードに時間があります。 – notz

答えて

1

OK、私はhttps://github.com/w3c/ServiceWorker/issues/612 @https://bugs.chromium.org/p/chromium/issues/detail?id=439697 @クロムバグレポートや関連ServiceWorkerスペックの問題を発見したと思います。

GWTはiframeを内部的に作成することでコードフラグメントを読み込みます。これらのiframeは親Service Workerによって制御されません。 Chromeのバグはまだ開いていますが、w3cは仕様の問題@https://github.com/w3c/ServiceWorker/issues/1163を閉じました。

+0

私は数日間、自分の答えを受け入れる前に、コミュニティが自分の理解を確認するのを待つつもりです。 – webstruck

+0

"PRETTY"スタイルを使用してこの例を再コンパイルして、何が起こっているかを確認します。 iframeの既知の動作は、DOM内の独立したコンテキストを表すためのものであるため、このように思われます。私は彼らが自分のサービスワーカーを必要としていると思う、ここでは関連する答えです:https://stackoverflow.com/questions/43932169/cache-if​​rame-request-with-serviceworker –

関連する問題