CacheStorage
åºçº¿
广æ³å¯ç¨
èª 2018å¹´4æ èµ·ï¼æ¤ç¹æ§å·²å¨ä¸»æµæµè§å¨ä¸å¾å°æ¯æï¼å¯å¨å¤§å¤æ°è®¾å¤åæµè§å¨çæ¬ä¸æ£å¸¸ä½¿ç¨ã
å®éªæ§: è¿æ¯ä¸é¡¹å®éªæ§ææ¯
å¨å°å
¶ç¨äºç产ä¹åï¼è¯·ä»ç»æ£æ¥æµè§å¨å
¼å®¹æ§è¡¨æ ¼ã
CacheStorage æ¥å£è¡¨ç¤º Cache 对象çåå¨ã宿ä¾äºä¸ä¸ª ServiceWorker ãå
¶ä»ç±»å worker æè
window èå´å
å¯ä»¥è®¿é®å°çææå½å cache ç主ç®å½ï¼å®å¹¶ä¸æ¯ä¸å®è¦å service workers ä¸èµ·ä½¿ç¨ï¼å³ä½¿å®æ¯å¨ service workers è§èä¸å®ä¹çï¼ï¼å¹¶ç»´æ¤ä¸ä»½å符串åç§°å°ç¸åº Cache å¯¹è±¡çæ å°ã
CacheStorage åæ ·æ´é²äº CacheStorage.open() å CacheStorage.match()æ¹æ³ãä½¿ç¨ CacheStorage.open() è·å Cache å®ä¾ãä½¿ç¨ CacheStorage.match() æ£æ¥ç»å®ç Request æ¯å¦æ¯ CacheStorage 对象è·è¸ªçä»»ä½ Cache 对象ä¸çé®ã
ä½ å¯ä»¥éè¿çªå£ç Window.caches 屿§æ worker ç WorkerGlobalScope.caches 屿§è®¿é® CacheStorageã
夿³¨ï¼CacheStorage æ»æ¯å¯¹ä¸åä¿¡ä»»çæºï¼å³é£äºä¸ä½¿ç¨ HTTPSï¼å°½ç®¡æ¤å®ä¹å°æ¥å¾å¯è½å徿´å 夿ãï¼ä½¿ç¨ SecurityError reject. æµè¯æ¶ï¼ä½ å¯ä»¥å¨ Firefox Devtools é项/齿轮èåä¸éè¿éä¸"éè¿ HTTP å¯ç¨ Service Workers (å½å·¥å
·ç®±æå¼æ¶)" é项æ¥ç»å¼è¿ä¸ªéå¶ã
夿³¨ï¼CacheStorage.match() æ¯ä¸ä¸ªä¾¿æ·æ¹æ³ãå¹é
cache æ¡ç®çåçåè½å¯ä»¥éè¿æ§è¡ CacheStorage.open() æå¼ cacheï¼ä½¿ç¨ CacheStorage.keys() è¿åå®å
å«çæ¡ç®ï¼å¹¶å°ä½ æéçæ¡ç®ä¸ CacheStorage.match() å¹é
ã
æ¹æ³
CacheStorage.match()-
æ£æ¥ç»å®ç
Requestæ¯å¦æ¯CacheStorage对象è·è¸ªçä»»ä½Cache对象çé®ï¼å¹¶è¿åä¸ä¸ª resolve 为该å¹é çPromise. CacheStorage.has()-
妿åå¨ä¸
cacheNameå¹é çCache对象ï¼åè¿åä¸ä¸ª resolve 为 true çPromise. CacheStorage.open()-
è¿åä¸ä¸ª
Promiseï¼resolve 为å¹é cacheNameï¼å¦æä¸åå¨åå建ä¸ä¸ªæ°ç cacheï¼çCache对象 CacheStorage.delete()-
æ¥æ¾å¹é
cacheNameçCache对象ï¼å¦ææ¾å°ï¼åå é¤Cache对象并è¿åä¸ä¸ª resolve 为 true çPromiseãå¦ææ²¡ææ¾å°Cache对象ï¼åè¿åfalse. CacheStorage.keys()-
è¿åä¸ä¸ª
Promiseï¼å®å°ä½¿ç¨ä¸ä¸ªå å«ä¸CacheStorageè¿½è¸ªçææå½åCache对象对åºåç¬¦ä¸²çæ°ç»æ¥ resolve. 使ç¨è¯¥æ¹æ³è¿ä»£ææCache对象çå表ã
示ä¾
æ¤ä»£ç çæ®µæ¥èªäº MDN sw-test example ï¼è¯·åé
sw-test running live.ï¼æ¤ service worker èæ¬çå¾
InstallEvent 触åï¼ç¶åè¿è¡ waitUntil æ¥å¤çåºç¨ç¨åºçå®è£
è¿ç¨ãè¿å
æ¬è°ç¨ CacheStorage.open å建ä¸ä¸ªæ°ç cacheï¼ç¶åä½¿ç¨ Cache.addAll åå
¶æ·»å ä¸ç³»åèµæºã
å¨ç¬¬äºä¸ªä»£ç åï¼æä»¬çå¾
FetchEvent 触åãæä»¬æå»ºèªå®ä¹ç¸åºï¼åè¿æ ·ï¼
- æ£æ¥ CacheStorage 䏿¯å¦æ¾å°äºå¹é 请æ±çå 容ã妿æ¯ï¼ä½¿ç¨å¹é å 容ã
- å¦ææ²¡æï¼ä»ç½ç»è·å请æ±ï¼ç¶ååæ ·æå¼ç¬¬ä¸ä¸ªä»£ç åä¸å建ç cacheï¼å¹¶ä½¿ç¨
Cache.put(cache.put(event.request, response.clone()).) å°è¯·æ±ç clone 坿¬æ·»å å°å®ã - å¦ææ¤æä½å¤±è´¥ï¼ä¾å¦ï¼å 为ç½ç»å ³éï¼ï¼è¿åå¤ç¨ç¸åºã
æåï¼ä½¿ç¨ FetchEvent.respondWith è¿åèªå®ä¹ååºæç»çäºçå
容ã
this.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",
]);
}),
);
});
this.addEventListener("fetch", function (event) {
var response;
event.respondWith(
caches
.match(event.request)
.catch(function () {
return fetch(event.request);
})
.then(function (r) {
response = r;
caches.open("v1").then(function (cache) {
cache.put(event.request, response);
});
return response.clone();
})
.catch(function () {
return caches.match("/sw-test/gallery/myLittleVader.jpg");
}),
);
});
说æ
| è§è |
|---|
| Service Workers Nightly> # cachestorage-interface> |