2017-11-03 5 views
0

サービスワーカーは、柔軟性とパワーが非常に優れていますが、キャッシュを管理下に置いて、不必要に大きくならないようにしなければなりません。年齢に基づいてサービスワーカーキャッシュのエントリを削除する

キャッシュされたアイテムの経過時間、つまりキャッシュに格納されていた時間、およびキャッシュされたアイテムを年齢に基づいて定期的に消去する方法はありますか?

私は、次の線に沿って何かについてここで考えている:

const RUNTIME = 'runtime-cache'; 

var getAgeOf = function (request) { 
    return (*time since request was cached*); // <-- but HOW? 
}; 

var purgeRuntimeCache = function (threshold) {  
    caches.open(RUNTIME).then(function (cache) { 
     cache.keys().then(function (keys) { 
      keys.forEach(function (request, index, array) { 
       cache.match(request).then(function (response) { 
        if (getAgeOf(request) > threshold) { 
         console.log('delete old resource from runtime cache: ' + request.url); 
         cache.delete(request); 
        } 
       }); 
      }); 
     }); 
    }); 
}; 
+0

@RobertRowntreeいくつかの有用なポインターを与えるおかげで。上記の私のコードスニペット(最内層)で 'response.headers ['date']'を使ってみましたが、 'undefined'を取得しました...何か間違っていますか? – drmrbrewer

+0

@RobertRowntreeこれは不透明なレスポンスでも問題になります。ヘッダーを照会して関連する日付を調べることはできません。カスタムの「キャッシュに入れる」日付を別々に保存する必要がありますか? – drmrbrewer

答えて

2

仕事箱の人々は、レスポンスのヘッダから「日付」を解析しているようです。また、日付が利用できない場合、応答は新鮮であると仮定します。 cacheExpirationプラグインのソースをhere以上に確認してください。私は、最初にネットワークから資産を取り出す際に、キャッシュされた時間をIndexedDBやキャッシュに保存することもできたと思います。

このようなものを手作業で実装して細部まで掘り下げていくのは良い練習ですが、私は人間はSWを扱うために図書館を使うのが一般的であると言います。 Workboxが最適なオプションかもしれません。

更新:

私は自分自身をこれを試していないが、私は、これは実際には動作しない何らかの理由が表示されません。

  • 利用SW
  • でそれを持っている
  • 使用importScript(IDB-keyval.min.jsからポイントこのに)KEYVALストアとしてのIndexedDBを使用することが超簡単にするidb-keyvalのようなもの
  • 何かをキャッシュするときは、そのURL(文字列)をIDBキーに、Unix時間を値として使用してください。
  • その後、キャッシュ項目を繰り返して、IDBにあるタイムスタンプと比較してください。あまりにも古い場合、キャッシュからdelte
+0

'date'を使用する際の問題は、不透明なリソース(キャッシュに有効であっても)に対してこの情報にアクセスできないことです。https://stackoverflow.com/a/39109790を参照してください。 CDNのほとんどのjsは不透明なので、それらは潜在的にワークボックスを使用していても無期限にあなたのSWの中にくっつくでしょう。 「アセットを取得したときにIndexedDBまたはキャッシュにキャッシュする時間を節約することができる」と言えば、どうすればよいでしょうか?これは、キャッシュされたエントリにいくつかのメタデータを関連付けることができる最も洗練された解決策になると思われます。 – drmrbrewer

+1

@drmrbrewer私の更新された答えを見てください:)それは助けますか? – pate

+1

不透明な応答では 'Date'を利用できませんが、少なくとも不透明な応答がキャッシュから最後に追加/読み込まれた時間を追跡するためにIndexedDBを使用し、それを使用して有効期限をトリガーすることができます。これはWorkboxの機能の一部です。 –

関連する問題