2014-08-28 7 views
3

Grunt 빌드로 작업하면서, 나는 rev 작업과 정적 자산의 수정/캐시 무효화 작업을 경험했습니다.타임 스탬프를 쿼리 매개 변수로 추가하는 것보다 파일 이름에 해시를 포함하는 것이 캐싱에 더 좋은 이유는 무엇입니까?

하나는 파일 이름 덮어 쓰기를 사용하고 다른 하나는 쿼리 매개 변수로 타임 스탬프를 추가합니다. And apparently, one is more preferable than the other.

왜 다른 것보다 낫지? 당신은 제공된 링크에서 코멘트

답변

6

하나는 가장 잘 말한다 :

"당신은 고유 한 이름을 갖게되면 성능에 좋은 곳입니다, 이는도 매우 공격적 캐싱 헤더를 사용할 수 있습니다."

<script type="text/javascript" src="@routes.Assets.at("javascripts/main.js")[email protected](new Date().getTime())"></script> 

그것은 고유의 타임 스탬프를 스크립트가 요청 될 때마다 추가 : 당신은 자신의 예에서이 버전을 타임 스탬프와

. 즉, 브라우저 결코 캐시합니다.

다른 방법이지만 내부 카운터를 추가하는 방법도 있습니다. 다음과 같은 내용 :

<script type="text/javascript" src="@routes.Assets.at("javascripts/main.js")?version=1234"></script> 

자산에서 뭔가를 변경할 때마다 버전 번호가 변경되기 때문에 조금 더 좋습니다. 그러면 브라우저는 정적 자산의 새 버전을 빌드 할 때까지 한 번만 버전을로드하고이를 캐시에 보관합니다.

단점은 어떻게 든 버전 번호를 추적해야한다는 것입니다. git commit과 같은 정적 인 것을 사용할 수 있지만 여전히이 버전을 감시하고 + git (또는 svn 또는 무엇을 사용하든)에 의존합니다.

해시 버전과 같은 javascripts/main.ab4c6c83e4fa9c.js는 다음과 같은 이점이 있습니다 : 그것은 단지 하나 개의 파일에 관련

  • 를 - 그래서 main.js.에 불과 따라 달라집니다 다른 쓸데없는 작업에서 무엇을 사용 하든지간에 main.js 만 신경 씁니다. 당신은 날짜 또는 버전 또는 무엇이든을 걱정하지 않는다.
  • 파일 내용과 만 관련이 있습니다. 따라서 js 코드를 변경하면 다른 내용 (예 : minifier)이 생성되므로 해시가 달라집니다. 브라우저가 강제로 새 버전을로드합니다.
  • 콘텐츠를 이전과 동일하게 다시 변경하면 (해당 버전으로 되돌릴뿐만 아니라 이후 버전에서도 같은 지점으로 변경됨) 해당 콘텐츠의 해시는 브라우저가 이미 캐시에 있습니다.

이와 같이, 당신은 날짜, 파일, 아무것도 신경 쓰지 않고 자바 스크립트 만 만들면됩니다. 또한 브라우저에 1 년 또는 영원한 시간 동안 캐시하도록 지시합니다. 버전 간을 전환하면 사용자가 올바른 버전을 얻을 수 있습니다.

+1

답장을 보내 주셔서 감사합니다. 아무 것도 변경되지 않았을 때 캐싱을 허용하는 것에 대한 요점은 새 코드로 재 컴파일을 한 후에 캐시를 파기하는 것입니다. 브릴 - – Kristian