55

現在、キャッシュ マニフェストを使用しています (ここで説明されているように)。これにより、ユーザーがオフラインのときに、アプリケーションを実行するために必要なリソースを効果的に利用できるようになります。

残念ながら、それは少しうまく機能します。

キャッシュ マニフェストが読み込まれると、Firefox 3.5+ はキャッシュ マニフェストで明示的に参照されているすべてのリソースをキャッシュします。ただし、サーバー上のファイルが更新され、ユーザーがオンライン中にページ (キャッシュマニフェスト自体を含む) を強制的に更新しようとすると、Firefox は何もフェッチすることを絶対に拒否します。アプリケーションは、最後にキャッシュされた時点で完全にフリーズしたままです。質問:

  1. ネットワーク接続が失敗したときに、Firefox が効果的にキャッシュされたリソースのみに依存するようにしたいと考えています。FALLBACK ブロックを使用してみましたが、役に立ちませんでした。これは可能ですか?
  2. #1が不可能な場合、ユーザーがページを強制的に更新してこのキャッシュをバイパスすることは可能ですか?または、キャッシュマニフェストメカニズムは有効期限ヘッダーをサポートしていますか?これに関するその動作はどこかに文書化されていますか?
4

6 に答える 6

25

私はこれを理解したと思います:キャッシュマニフェストにエラーがある場合 (たとえば、参照されたファイルが存在しない場合)、Firefox は applicationCache 関連の処理を完全に停止します。つまり、キャッシュされたキャッシュ マニフェストを含め、キャッシュ内の何も更新されません。

これが問題であることを明らかにするために、Mozilla からいくつかのコードを借りて、これをアプリケーションの新しい (キャッシュされていない) HTML ファイルに落とし込みました。ログに記録された最後のメッセージは、キャッシュ マニフェストに問題がある可能性があることを示しており、確かに (ファイルが見つからない) ありました。


// Convenience array of status values
var cacheStatusValues = [];
 cacheStatusValues[0] = 'uncached';
 cacheStatusValues[1] = 'idle';
 cacheStatusValues[2] = 'checking';
 cacheStatusValues[3] = 'downloading';
 cacheStatusValues[4] = 'updateready';
 cacheStatusValues[5] = 'obsolete';

 // Listeners for all possible events
 var cache = window.applicationCache;
 cache.addEventListener('cached', logEvent, false);
 cache.addEventListener('checking', logEvent, false);
 cache.addEventListener('downloading', logEvent, false);
 cache.addEventListener('error', logEvent, false);
 cache.addEventListener('noupdate', logEvent, false);
 cache.addEventListener('obsolete', logEvent, false);
 cache.addEventListener('progress', logEvent, false);
 cache.addEventListener('updateready', logEvent, false);

 // Log every event to the console
 function logEvent(e) {
     var online, status, type, message;
     online = (isOnline()) ? 'yes' : 'no';
     status = cacheStatusValues[cache.status];
     type = e.type;
     message = 'online: ' + online;
     message+= ', event: ' + type;
     message+= ', status: ' + status;
     if (type == 'error' && navigator.onLine) {
         message+= ' There was an unknown error, check your Cache Manifest.';
     }
     log('
'+message); } function log(s) { alert(s); } function isOnline() { return navigator.onLine; } if (!$('html').attr('manifest')) { log('No Cache Manifest listed on the tag.') } // Swap in newly download files when update is ready cache.addEventListener('updateready', function(e){ // Don't perform "swap" if this is the first cache if (cacheStatusValues[cache.status] != 'idle') { cache.swapCache(); log('Swapped/updated the Cache Manifest.'); } } , false); // These two functions check for updates to the manifest file function checkForUpdates(){ cache.update(); } function autoCheckForUpdates(){ setInterval(function(){cache.update()}, 10000); } return { isOnline: isOnline, checkForUpdates: checkForUpdates, autoCheckForUpdates: autoCheckForUpdates }

これは確かに役に立ちましたが、少なくともエラー コンソールに不正な形式のキャッシュ マニフェストを出力する機能を Mozilla に要求する必要があります。名前が変更されたファイルのように些細な問題を診断するために、カスタム コードをこれらのイベントにアタッチする必要はありません。

于 2009-11-11T17:07:17.917 に答える
16

HTML5 Rocks: Update the cache のコードを使用しました:

window.addEventListener('load', function(e) {
  if (window.applicationCache) {
    window.applicationCache.addEventListener('updateready', function(e) {
        if (window.applicationCache.status == window.applicationCache.UPDATEREADY) {
          // Browser downloaded a new app cache.
          // Swap it in and reload the page to get the new hotness.
          window.applicationCache.swapCache();
          if (confirm('A new version of this site is available. Load it?')) {
            window.location.reload();
          }
        } else {
          // Manifest didn't changed. Nothing new to server.
        }
    }, false);
  }
}, false);
于 2011-11-21T12:09:30.517 に答える
8

私は同じ問題を抱えていました.Firefoxがオフラインファイルを保存すると、それらを再ロードしません. Chrome は期待どおりに機能し、マニフェスト ファイルの変更をチェックし、マニフェスト ファイルが変更された場合はすべてをリロードしました。Firefox はサーバーからマニフェスト ファイルをダウンロードすることさえしなかったため、変更に気付くことができませんでした。

調査の結果、Firefox がキャッシュ マニフェスト ファイル (オフライン キャッシュではなく、昔ながらのキャッシュ) をキャッシュしていることがわかりました。マニフェスト ファイルのキャッシュ ヘッダーを設定しCache-Control: no-cache, privateて問題を解決しました。

于 2012-03-20T10:34:00.407 に答える
7

免責事項: マニフェストとキャッシュに関する私の経験はすべて Safari であり、FF ではいくつかの処理が異なる場合があります。

  1. たしかにそれは正しいね。マニフェストにリストされているファイルが見つからない場合、キャッシュは発生しません。

  2. オンラインであっても、ブラウザはマニフェスト ファイルのみをチェックします。マニフェスト ファイルを待っている間、キャッシュからサイトを読み込み続けます (レンダリングが遅れることはありません)。ただし、最初の読み込みで変更が表示されないことを意味します。

  3. 次にサイトが読み込まれるときに、前回の読み込みでマニフェストが変更された場合、新しいファイルが読み込まれます。

変更を確認するには、常に 2 回リロードする必要があります。実際、更新を確認するために 3 回リロードしなければならないことがありました。理由はわかりません。

デバッグ時には、php を使用してその場でマニフェスト ファイルを生成するため、ファイル名にタイプミスが発生する可能性はありません。また、更新を強制するために毎回バージョン番号をランダムに生成しますが、まだテスト用のオフライン Web アプリケーションがあります。

完了すると、php ファイルは保存されたマニフェスト データを一定のバージョン番号でエコーすることができ、キャッシュは常に使用されます。

最近マニフェストとキャッシュで遊んでいるときに学んだことのほんの一部です。うまく機能しますが、混乱する可能性があります。

有効期限はありません。キャッシュを解除するには、マニフェスト ファイルに何も含まれないように変更し、リロードを実行する必要があります。Safari では、ユーザー キャッシュをクリアすると、すべてのキャッシュ ファイルがクリアされます。

于 2009-11-13T06:15:18.637 に答える
3

キャッシュ マニフェストを無効にし、HTML5 ローカル ストレージをクリアする Firefox アドオンを作成しました。

http://sites.google.com/site/keigoattic/home/webrelated#TOC-Firefox-HTML5-Offline-Cache-and-Loc

エラー コンソールに以下のコードを入力して、キャッシュ マニフェストを無効にすることもできます。

// invalidates the cache manifest
var mani = "http://.../mysite.manifest"; // manifest URL
Components.classes["@mozilla.org/network/application-cache-service;1"].getService(Components.interfaces.nsIApplicationCacheService).getActiveCache(mani).discard();

または、アドレス バーに以下のコードを入力すると、手動でキャッシュが更新されます。

javascript:applicationCache.update()
于 2010-09-30T06:55:12.247 に答える
2

うーん、マニフェストファイルに編集変更を加えた後、キャッシュで update() を呼び出し、チェック/ダウンロード/準備完了の完全なシーケンスを受け取り、1回リロードし、jsの1つで行ったテキスト変更を受け取りましたアプリの最初のページに表示されるファイルがすぐに表示されました。

リロードは1回だけでいいようです。

于 2010-07-04T11:05:14.197 に答える