2017-11-03 7 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

연장 상자의 사람들은 응답의 헤더에서 '날짜'를 분석하는 것으로 보인다. 또한 날짜를 사용할 수없는 경우 응답이 신선한 것으로 가정합니다. 그들의 소스에서 here 이상의 cacheExpiration 플러그인을 확인하십시오. 나는 처음으로 네트워크에서 자산을 가져 오면 캐시 된 시간을 IndexedDB 또는 캐시에 저장할 수 있다고 생각합니다 (예 : 자산 URL을 키로 사용).

손으로 이런 것을 구현하고 세부 사항을 파헤 치는 것이 좋은 운동이지만, 사람들은 일반적으로 SW를 다루기 위해 라이브러리를 사용하는 것이 좋습니다. Workbox이 최선의 방법 일 수 있습니다.

업데이트 :

나는 자신이 밖으로 시도하지 않은하지만 난이 실제로 작동하지 않을 어떤 이유가 표시되지 않습니다. idb-keyval 같은

  • 사용 무언가는 매우 간단 keyval 저장
  • 사용 importScript로 색인화를 사용할 수 있도록하기 위해 SW에 그것을 가지고 (이하기 IDB-keyval.min.js)
  • 무언가를 캐시 할 때 URL (문자열)을 IDB 키로 사용하고 Unix 시간을 값으로 사용하십시오.
  • 나중에 캐시 항목을 반복하여 IDB에있는 타임 스탬프와 비교하십시오. 너무 오래된 캐시에서 delte
+0

'date'를 사용할 때의 문제점은 불투명 한 자원 (캐시 할 수 있다고하더라도)에 대해서는이 정보에 접근 할 수 없다는 것입니다. 여기서는 https://stackoverflow.com/a/39109790을 참조하십시오. CDN의 거의 모든 js는 불투명합니다. 그래서 그것들은 잠재적으로 여러분의 SW에서 무한히 워크 박스를 사용하는 것입니다. "자산을 가져올 때 IndexedDB 또는 캐시에 캐싱 시간을 저장할 수도 있습니다."라고 말하면 어떻게됩니까? 캐시 된 항목과 일부 메타 데이터를 연결할 수있는 가장 우아한 솔루션이라고 생각됩니다. – drmrbrewer

+1

@drmrbrewer 내 업데이트 된 답변보기 :) 도움이 되나요? – pate

+1

불투명 응답에서는 '날짜'를 사용할 수 없지만 적어도 불투명 한 응답이 캐시에서 마지막으로 추가되거나 읽혀지는 시간을 추적하기 위해 IndexedDB를 사용하고 만료를 트리거하는 데 IndexedDB를 사용할 수 있습니다. 이것이 Workbox의 일부입니다. –