在使用Grunt构建时,我遇到了rev
任务和cachebreaker
任务,需要修改/缓存静态资产。
一个使用文件名覆盖,另一个使用时间戳作为查询参数。 And apparently, one is more preferable than the other.
为什么一个比另一个好?
答案 0 :(得分:8)
您提供的链接中的一条评论说得最好:
"一旦你有了唯一的名字,你也可以使用非常积极的缓存标题,这对于提高性能非常有用。"
使用时间戳,您的示例中包含此版本:
<script type="text/javascript" src="@routes.Assets.at("javascripts/main.js")?nocache=@(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
具有以下好处:
因此,有了这些,您就不会关心日期,文件,任何事情,只需创建您的Javascript即可。您还可以告诉浏览器将其缓存为一年,或者永久。并且您确定如果您在版本之间切换,则用户会获得正确的版本。