2011-01-22 2 views
6

정적 파일 (.js, .css)을 참조하는 HTML 파일을 렌더링 할 때 캐시 무효화는 어떻게 처리합니까? 파일을 변경할 때마다 수동으로 blabla.css? v = VERSIONNUMBER을 (를) 변경 하시겠습니까? 파일의 mtime을 기반으로하는 자동 메커니즘이 있습니까?node.js 캐시 분할 기술

+0

가장 간단한 방법으로 앱의 시작 타임 스탬프를 각 정적 리소스에 대한 쿼리 문자열로 추가하면됩니다. 예 : http://ankitjain.info/ankit/2013/12/05/cache-busting-nodejs-express-jade/ – ankitjaininfo

답변

7

HTTP 프로토콜로 캐싱을 남기고 싶습니다. 각 응답에 ETag 응답 헤더를 제공하고 If-none-match 요청 헤더를 확인하여 조건부 요청에 대한 지원을 추가하기 만하면됩니다.

엔터티 태그를 계산하는 좋은 방법은 파일을 저장하는 방법에 따라 다릅니다. 일반적인 * nix 파일 시스템에서 inode 값은 좋은 시작입니다.

예 : 특별한 경우

fs.stat(filePath, function(err, stats) { 
    if (err || !stats.isFile()) { 
     //oops 
    } 
    else { 
     var etag = '"' + stats.ino + '-' + stats.size + '-' + Date.parse(stats.mtime) + '"'; 

     //if etag in header['if-non-match'] => 304 
     //else serve file with etag 
    } 
}); 

, 당신도 파일 변경 자마자 항목을 무효화하기 위해 fs.watchFile() 콜백을 메모리에 ETAG 또는 파일을 캐시하고 등록 할 수 있습니다.

+0

감사합니다. 하지만 일부 브라우저에서는 이러한 헤더를 무시하고 캐시에 파일이있는 경우 304를 확인하지 않아도됩니다. 어떻게 든 제안 사항이 여전히 해결되지 않은 것입니까? –

+0

게다가 .. 파이어 폭스가 .. 음 .. * 거짓말 * 할 수 있니? (방화 녀석을 통해)? 그 Net 탭에서 _reality_에서 내 서버에 충돌하거나 Fiddler에 나타나지 않는 동안 (정적 인 파일을 가져 와서 좋은 200 HTTP 응답으로 반환하는 요청을 봅니다. 그들은 매우 공격적인 로컬 캐시에 의해 처리됩니다) - 내가 뭔가를 놓친다면 다시 이해시켜주세요. –