--- title: CacheStorage slug: Web/API/CacheStorage tags: - API - CacheStorage - Experimental - Interface - Reference - Service Workers - ServiceWorker translation_of: Web/API/CacheStorage ---
{{APIRef("Service Workers API")}}
CacheStorage インターフェイスは、{{domxref("Cache")}} オブジェクトのストレージを表します。
このインターフェイスは、
undefined になります。{{domxref("CacheStorage.open()")}} を使用して、{{domxref("Cache")}} インスタンスを取得します。
{{domxref("CacheStorage.match()")}} を使用して、所与の {{domxref("Request")}} が CacheStorage オブジェクトが追跡する {{domxref("Cache")}} オブジェクトのキーであるかどうかを確認します。
グローバルな {{domxref("WindowOrWorkerGlobalScope.caches", "caches")}} プロパティを介して CacheStorage にアクセスできます。
SecurityError で常に拒否します。 テストするときは、 Firefox 開発ツールの設定/歯車印メニューの「HTTP による Service Worker を有効化(ツールボックスを開いた時)」オプションをチェックすることで、この問題を回避できます。cacheName に一致する {{domxref("Cache")}} オブジェクトが存在する場合、true に解決される {{jsxref("Promise")}} を返します。cacheName に一致する {{domxref("Cache")}} オブジェクトに解決される {{jsxref("Promise")}} を返します(まだ存在しない場合は新しいキャッシュが作成されます)。cacheName に一致する {{domxref("Cache")}} オブジェクトを見つけ、見つかった場合は {{domxref("Cache")}} オブジェクトを削除し、true に解決される {{jsxref("Promise")}} を返します。 {{domxref("Cache")}} オブジェクトが見つからない場合、false に解決されます。このコードスニペットは、MDN の sw-test の例からのものです(sw-test をライブで見る)。 このサービスワーカーのスクリプトは、{{domxref("InstallEvent")}} が発生するのを待ち、{{domxref("ExtendableEvent.waitUntil","waitUntil")}} を実行してアプリのインストールプロセスを処理します。 これは、{{domxref("CacheStorage.open")}} を呼び出して新しいキャッシュを作成し、{{domxref("Cache.addAll")}} を使用して一連のアセットを追加することで構成されます。
2番目のコードブロックでは、{{domxref("FetchEvent")}} が発生するのを待ちます。 次のようなカスタムレスポンスを作成します。
CacheStorage でリクエストに一致するものが見つかったかどうかを確認します。 もしそうなら、それを提供します。cache.put(event.request, response.clone()))を使用してリクエストのクローンを追加します。最後に、{{domxref("FetchEvent.respondWith")}} を使用して、カスタムレスポンスが等しくなったものをすべて返します。
self.addEventListener('install', function(event) {
event.waitUntil(
caches.open('v1').then(function(cache) {
return cache.addAll([
'/sw-test/',
'/sw-test/index.html',
'/sw-test/style.css',
'/sw-test/app.js',
'/sw-test/image-list.js',
'/sw-test/star-wars-logo.jpg',
'/sw-test/gallery/bountyHunters.jpg',
'/sw-test/gallery/myLittleVader.jpg',
'/sw-test/gallery/snowTroopers.jpg'
]);
})
);
});
self.addEventListener('fetch', function(event) {
event.respondWith(caches.match(event.request).then(function(response) {
// caches.match() は常に解決します
// ただし、成功の場合はレスポンスに値があります
if (response !== undefined) {
return response;
} else {
return fetch(event.request).then(function (response) {
// レスポンスは1回のみ使用できます
// クローンを保存して、1番目のコピーをキャッシュに入れ、
// 2番目のコピーを提供する必要があります
let responseClone = response.clone();
caches.open('v1').then(function (cache) {
cache.put(event.request, responseClone);
});
return response;
}).catch(function () {
return caches.match('/sw-test/gallery/myLittleVader.jpg');
});
}
}));
});
このスニペットは、サービスワーカーのコンテキストの外部で API を使用する方法を示しており、`await` 演算子を使用してより読みやすいコードにしています。
// キャッシュからデータを取得しようとしますが、フォールバックしてライブで取得します。
async function getData() {
const cacheVersion = 1;
const cacheName = `myapp-${ cacheVersion }`;
const url = 'https://jsonplaceholder.typicode.com/todos/1';
let cachedData = await getCachedData( cacheName, url );
if ( cachedData ) {
console.log( '取得したキャッシュデータ' );
return cachedData;
}
console.log( '最新データの取得' );
const cacheStorage = await caches.open( cacheName );
await cacheStorage.add( url );
cachedData = await getCachedData( cacheName, url );
await deleteOldCaches( cacheName );
return cachedData;
}
// キャッシュからデータを取得します。
async function getCachedData( cacheName, url ) {
const cacheStorage = await caches.open( cacheName );
const cachedResponse = await cacheStorage.match( url );
if ( ! cachedResponse || ! cachedResponse.ok ) {
return false;
}
return await cachedResponse.json();
}
// 古いキャッシュを削除して、ユーザーのディスク容量を尊重します。
async function deleteOldCaches( currentCache ) {
const keys = await caches.keys();
for ( const key of keys ) {
const isOurCache = 'myapp-' === key.substr( 0, 6 );
if ( currentCache === key || ! isOurCache ) {
continue;
}
caches.delete( key );
}
}
try {
const data = await getData();
console.log( { data } );
} catch ( error ) {
console.error( { error } );
}
| 仕様 | 状態 | コメント |
|---|---|---|
| {{SpecName('Service Workers', '#cachestorage', 'CacheStorage')}} | {{Spec2('Service Workers')}} | 初期定義 |
{{Compat("api.CacheStorage")}}