Baseline Widely available
ë³´ì 컨í ì¤í¸: ì´ ê¸°ë¥ì ì¼ë¶ ëë 모ë ì§ì ë¸ë¼ì°ì ì ë³´ì 컨í ì¤í¸ (HTTPS)ììë§ ì¬ì©í ì ììµëë¤.
ì°¸ê³ : ì´ ê¸°ë¥ì Web Workerìì ì¬ì©í ì ììµëë¤.
CacheStorage
ì¸í°íì´ì¤ë Cache
ê°ì²´ë¤ì ìí ì ì¥ì를 ëíë
ëë¤.
ì´ ì¸í°íì´ì¤ë ë¤ìê³¼ ê°ìµëë¤.
ServiceWorker
ëë ë¤ë¥¸ ì íì ì커, í¹ì window
ë²ììì ì ê·¼í ì ìë 모ë ì´ë¦ì´ ì§ì ë ìºìë¤ì ë§ì¤í° ëë í°ë¦¬ë¥¼ ì ê³µí©ëë¤(ìë¹ì¤ ì커ììë§ ì¬ì©í íìë ììµëë¤).Cache
ê°ì²´ ê°ì 매íì ì ì§í©ëë¤.CacheStorage.open()
ë©ìë를 ì¬ì©íì¬ Cache
ì¸ì¤í´ì¤ë¥¼ ì»ìµëë¤.
주ì´ì§ Request
ê° CacheStorage
ê°ì²´ê° ì¶ì íë Cache
ê°ì²´ ì¤ ì´ë ê³³ì í¤ì¸ì§ íì¸íë ¤ë©´ CacheStorage.match()
ë©ìë를 ì¬ì©í©ëë¤.
ìëì°ììë Window.caches
ìì±ì, ì커ììë WorkerGlobalScope.caches
ìì±ì íµí´ CacheStorage
ì ì ê·¼í ì ììµëë¤.
ì°¸ê³ :ì 뢰í ì ìë ì¶ì²(ì¦, HTTPS를 ì¬ì©íì§ ìë ì¶ì²)ììëCacheStorage
ê° íì SecurityError
ë¡ ê±°ë¶ë©ëë¤(ì´ ì ìë í¥í ë ë³µì¡í´ì§ ì ììµëë¤). Firefoxìì í
ì¤í¸í ê²½ì°, Firefox DevTools ìµì
/ì¤ì ë©ë´ìì Enable Service Workers over HTTP (ë구 모ìì´ ì´ë ¤ìì ë) ìµì
ì íì±ííì¬ ì´ë¥¼ ì°íí ì ììµëë¤. ëí, CacheStorage
ë íì¼ ìì¤í
ì ê·¼ì´ íìí기 ë문ì Firefoxì ê°ì¸ 모ëìì ì¬ì©í ì ìì ìë ììµëë¤.
ì°¸ê³ :CacheStorage.match()
ë í¸ì ë©ìëì
ëë¤. ìºì í목과 ì¼ì¹íë 기ë¥ì CacheStorage.keys()
ë¡ë¶í° ìºì ì´ë¦ ë°°ì´ì ë°ííê³ , ê° ìºì를 CacheStorage.open()
ì¼ë¡ ì° ë¤ì, ìíë í목ì Cache.match()
ì¼ë¡ ì¼ì¹ìí´ì¼ë¡ì¨ 구íí ì ììµëë¤.
CacheStorage.match()
주ì´ì§ Request
ê° CacheStorage
ê°ì²´ê° ì¶ì íë Cache
ê°ì²´ ì¤ ì´ë ê³³ì í¤ì¸ì§ íì¸íê³ , ê·¸ ì¼ì¹ í목ì ì´ííë Promise
를 ë°íí©ëë¤.
CacheStorage.has()
cacheName
ì í´ë¹íë Cache
ê°ì²´ê° ì¡´ì¬íë©´ true
를 ì´ííë Promise
를 ë°íí©ëë¤.
CacheStorage.open()
cacheName
ì í´ë¹íë Cache
ê°ì²´ë¥¼ ì´ííë Promise
를 ë°íí©ëë¤(ì¡´ì¬íì§ ìì ê²½ì° ìë¡ì´ ìºìê° ìì±ë©ëë¤).
CacheStorage.delete()
cacheName
ì í´ë¹íë Cache
ê°ì²´ë¥¼ ì°¾ì, ì¡´ì¬íë¤ë©´ í´ë¹ ê°ì²´ë¥¼ ìì í í true
를 ì´ííë Promise
를 ë°íí©ëë¤. ë§ì½ í´ë¹ ê°ì²´ê° ìì¼ë©´ false
를 ì´íí©ëë¤.
CacheStorage.keys()
CacheStorage
ê° ì¶ì íë 모ë ì´ë¦ì´ ì§ì ë Cache
ê°ì²´ì í´ë¹íë 문ìì´ ë°°ì´ì ì´ííë Promise
를 ë°íí©ëë¤. ì´ ë©ìë를 ì¬ì©íì¬ ëª¨ë Cache
ê°ì²´ 목ë¡ì ìíí ì ììµëë¤.
ì´ ì½ë ì¤ëí«ì MDN simple service worker exampleìì ê°ì ¸ì¨ ê²ì¼ë¡, ì¤ì ìëíë simple service worker ìì 를 ì°¸ê³ í ì ììµëë¤.
ì´ ìë¹ì¤ ì커 ì¤í¬ë¦½í¸ë install
ì´ë²¤í¸ê° ë°ìí ëê¹ì§ ë기í í, ì±ì ì¤ì¹ ê³¼ì ì ì²ë¦¬í기 ìí´ waitUntil
ì ì¤íí©ëë¤. ì´ ê³¼ì ì ìë¡ì´ ìºì를 ìì±í기 ìí´ CacheStorage.open
ì í¸ì¶íê³ , ê·¸ ë¤ì Cache.addAll
ì ì¬ì©íì¬ ì¼ë ¨ì ìì°ë¤ì ì¶ê°íë ê²ì¼ë¡ 구ì±ë©ëë¤.
ë ë²ì§¸ ì½ë ë¸ë¡ììë FetchEvent
ì´ë²¤í¸ê° ë°ìí ëê¹ì§ ë기í©ëë¤. ê·¸ë¦¬ê³ ë¤ìê³¼ ê°ì´ 커ì¤í
ìëµì 구ì±í©ëë¤.
Cache.put
ì ì¬ì©íì¬ ìì²ì ë³µì 본ì ì¶ê°í©ëë¤(cache.put(event.request, response.clone())
).ë§ì§ë§ì¼ë¡, ìµì¢
ì ì¼ë¡ 구ì±ë 커ì¤í
ìëµì FetchEvent.respondWith
ì ì¬ì©íì¬ ë°íí©ëë¤.
self.addEventListener("install", (event) => {
event.waitUntil(
caches
.open("v1")
.then((cache) =>
cache.addAll([
"/",
"/index.html",
"/style.css",
"/app.js",
"/image-list.js",
"/star-wars-logo.jpg",
"/gallery/bountyHunters.jpg",
"/gallery/myLittleVader.jpg",
"/gallery/snowTroopers.jpg",
]),
),
);
});
self.addEventListener("fetch", (event) => {
event.respondWith(
caches.match(event.request).then((response) => {
// caches.match() ë íì resolve ë©ëë¤.
// ì±ê³µ ììë response ì ê°ì´ ììµëë¤.
if (response !== undefined) {
return response;
} else {
return fetch(event.request)
.then((response) => {
// response ë í ë²ë§ ì¬ì©ë ì ììµëë¤.
// ìºìì ë³µì¬ë³¸ì ì ì¥í기 ìí´ cloneì ë³´ì¡´í´ì¼ íë©°,
// ë ë²ì§¸ ë³µì¬ë³¸ì ìëµì¼ë¡ ì¬ì©í©ëë¤.
let responseClone = response.clone();
caches.open("v1").then((cache) => {
cache.put(event.request, responseClone);
});
return response;
})
.catch(() => caches.match("/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("Retrieved cached data");
return cachedData;
}
console.log("Fetching fresh data");
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 = key.startsWith("myapp-");
if (currentCache === key || !isOurCache) {
continue;
}
caches.delete(key);
}
}
try {
const data = await getData();
console.log({ data });
} catch (error) {
console.error({ error });
}
ëª
ì¸ì ë¸ë¼ì°ì í¸íì± ê°ì´ 보기
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4