web-dev-qa-db-ja.com

Service Workerのストレージ制限は何ですか?

ほとんどのブラウザは、ドメインごとに5MBのストレージ制限を持つlocalStorageを提供します。サービスワーカーに関してそのようなメモリ制限/制約はありますか?

Web Workers(Service Workerのベース)にはそのような制限がないことを知っています。ただし、Web Workersは資産のキャッシュに正確に使用されるのではなく、処理に多く使用されます(CPUが主な関心事です)。

メモリサイズに制限がない場合、不適切に設計されたWebサイトがブラウザをクラッシュさせる可能性がありますか?

63
Nachiketha

2018年1月15日更新

ストレージAPIの StorageManager インターフェースは、すべてのストレージ関連apiクエリの標準になりつつあります。 @ miguel-lattuada で述べたように、 推定API は、利用可能なストレージであるWebアプリで使用されるストレージの推定値を提供します。また、エラーシナリオの処理に役立つ QuotaExceededError 例外にも注意してください。

例:コード:

if ('storage' in navigator && 'estimate' in navigator.storage) {
  navigator.storage.estimate().then(({usage, quota}) => {
    console.log(`Using ${usage} out of ${quota} bytes.`);
  }).catch(error => {
    console.error('Loading storage estimate failed:');
    console.log(error.stack);
  });
} else {
  console.error('navigator.storage.estimate API unavailable.');
}

詳細については、次の2つの優れた記事を参照してください。


2017年3月16日(参照/履歴のためだけに保持)

最近、私はこの記事に出会いました: offline-cookbook 以下のように述べています:

Originには、必要な処理を行うために一定量の空き領域が与えられます。その空き領域は、すべてのOriginストレージで共有されます:LocalStorage、IndexedDB、Filesystem、そしてもちろんCaches。

取得する量は指定されていません。デバイスとストレージの状態によって異なります。あなたが持っている量を見つけることができます:

navigator.storageQuota.queryInfo("temporary").then(function(info) {
   console.log(info.quota);
   // Result: <quota in bytes>
   console.log(info.usage);
   // Result: <used data in bytes>
});

上記のコード すべてのブラウザで動作しない可能性があります 。 (例:chrome <48ではwebkitPersistentStorageなどを探す必要があるかもしれません)

その他の有用な情報/リソース

  1. プログレッシブWebアプリのオフラインストレージ Addy Osmaniによる

    Chrome and Opera:ストレージはOriginごと(APIごとではなく)です。両方のストレージメカニズムは、ブラウザクォータに達するまでデータを保存します。アプリは、Quota Management APIを使用して、使用しているクォータの量を確認できます(上記を参照)。

    Firefox制限はありませんが、50MBのデータが保存されるとプロンプトが表示されます

    Mobile Safari 50MB最大

    Desktop Safari無制限(5MB以降のプロンプト)

    IE10+最大250MB、プロンプト10MB

  2. モバイルブラウザーでのクォータの操作 北村英二による詳細なガイド。

今のところ、これらは私の問題に最も関連性の高い記事/ソリューションです。誰かがより良い記事や仕様を知っている場合は共有してください。

68
Nachiketha

明示的な制限はありません。最新のブラウザはすべてマルチプロセスなどであるため、不適切に設計されたページ(またはSW)は、クラッシュするほど悪いことはしません。

SW仕様は、ブラウザがいつでも、何らかの理由でSWを強制終了および再起動できることを明確に示していることに注意してください。 (DevToolsがページで開いている場合、Chromeは、目的のページのSWを常に意図的に強制終了します。これにより、優れたプラクティスを採用することができます。)

8
Xanthir

navigator.storage.estimate()およびnavigator.webkitTemporaryStorage.queryUsageAndQuota()の詳細はこちら https://developers.google.com/web/updates/2017/08/estimating-available-storage-space

テストページはこちら https://thimbleprojects.org/startpolymer/361372/

2
Josef Ježek

最新のブラウザでは、ブラウザストレージの新しい標準の実装である StorageManager を使用できます。 this mozillaの記事をご覧ください。

let _storageStats = await navigator.storage.estimate();
console.log(_storageStats);
/*
  Will Prompt something like this
  {quota: 15946471833, usage: 682}
  Which is a representation of quota/usage in bytes
  As you can see I get an insane quota of almost 16 GB
*/
1
Miguel Lattuada

100%確実ではありませんが、クライアントマシンで利用可能なものによって完全に制限されていると思います。同様に、固定の上限はありません

誰かがマシンの獣を走らせていて、ブラウザが唯一のアクティブなアプリケーションであった場合、おそらく十分なストレージが利用可能です

ただし、古い限定マシンであれば、ほとんど動きません。あなたはほとんど持っていないだろう

それはあなたが本当にやろうとしていることに完全に依存しています。あなたは本当にあなたのページ/アプリケーションの動作に不可欠なものを保存するためにサービスワーカーを使用するべきです

0
Ryuu