如何在<head>部分中对文件进行版本控制?

6

我在各种网站上看到开发人员如何通过指定类似于查询字符串的方式对其css/javascript文件进行版本控制:

<head>
    <link rel="stylesheet" href="css/style.css?v=1">
    <script src="js/helper.js?v=1">
</head>

如何完成这个过程?这是一个好的实践吗?我一直在搜索,但显然我没有找到正确的术语。如果有影响的话,我正在使用ASP.NET。

编辑::我刚刚注意到(通过Firebug),如果我“版本”我的文件(?v=1),它们将始终加载并始终覆盖缓存。有什么解决办法吗?

提前致谢。

3个回答

4

它们并没有真正的版本控制。我们这样做是因为某些浏览器不会正确地请求样式表(甚至不会检查最后修改时间),所以为了强制它们发出新的请求,你可以在引用它的html文件中增加一个数字。这有点像黑客行为,但它确实起作用。


1
很有趣。你能详细说明哪些浏览器存在问题吗?如果使用E-tag代替或与最后修改日期一起使用,是否会出现相同的行为? - Peter Ruderman
这主要是缓存的问题。如果浏览器下载了 style.css,然后页面稍后再次请求它,浏览器很可能会使用已经下载的版本。然而,如果看到的是 style.css?v=1 而不是 style.css,它将视为不同的文件并下载新版本。 - Ryan Kinal
没错,但浏览器在从服务器请求文件时应该提供文件的最后修改日期和/或e-tag,以便服务器有机会返回HTTP304(未修改)而不是整个文件。我想了解更多关于这种机制何时以及为什么会失败的信息。 - Peter Ruderman
@WildJoe:很有趣。话说,“你能详细说明哪些浏览器存在问题吗?”? - rebelliard
1
我记不太清楚,但它们都是很旧的(像IE5/FF1那样的旧)。如果您的Web服务器(或独立的缓存层,如代理)缓存静态内容,您可能也会遇到问题。这个技巧解决了所有这些问题,但如果您想要将其缓存起来,应该删除?v=1。 - WildJoe
@WildJoe:我刚刚注意到(通过Firebug),如果我给我的文件加上“版本”号码(?v=1),它们将始终被加载并且将始终覆盖缓存。有什么解决办法吗? - rebelliard

2

当你需要缓存时,它可以帮助缓存;当你不需要缓存时,它可以强制下载。文件的缓存是基于它们的路径进行的。所以如果路径相同,它就可以从缓存中获取。但如果它们不同,也就是新版本,则不会使用缓存,而应该获取新文件。至少我是这样使用的。


1

他们这样做是为了使浏览器缓存更加可靠。您可以手动添加版本,并在每次更改文件时递增它。这样,浏览器会认为它有一个新文件并确保下载它。

我不知道如何在ASP.NET中自动执行此操作,例如Ruby on Rails会检查文件上的最后更改时间戳,并将其添加为版本号。我相信您能够在ASP.NET中实现类似的功能。


我刚刚注意到(通过Firebug),如果我给我的文件加上“版本”号码(?v=1),它们将始终被加载并且将始终覆盖缓存。有没有什么解决办法? - rebelliard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接