关于如何实现js / css版本控制的需要建议

时间:2012-08-28 17:44:32

标签: javascript version-control web

所以我正在实现这个js / css版本控制方案,其中我基本上附加了js / css文件的校验和。我想到的策略是,基本上得到这个校验和值,然后计算文件的校验和(我假设可能来自缓存),如果它们匹配,那么客户端有最新的文件,如果不是那么客户端浏览器将强制从服务器下载该特定文件。这种方法是否正确? 另外,我想了解脚本标记的行为,比如脚本标记的src attr,首先转到js文件的缓存还是直接转到Web服务器?

由于

2 个答案:

答案 0 :(得分:2)

嗯,它在现实场景中实际上更简单。您将一些唯一的校验和附加到JavaScript文件 name (您不会更改文件本身),并在HTML文件中使用该全名。此外,当浏览器请求此.js文件时,您将在未来使用Expires标题(通常为一年),以便浏览器缓存此文件“ forever ”。看看您正在使用的网站的来源:

<script src="http://cdn.sstatic.net/js/stub.js?v=aa8b9e2e0673" type="text/javascript"></script>
<link href="http://cdn.sstatic.net/stackoverflow/all.css?v=ffb907d7e663" rel="stylesheet" type="text/css">

(SO使用 @machineghost 所述的技术)。

只要您不更改.js文件,其校验和和文件名相同,浏览器就没有做任何事情。该文件已缓存,您说它将在一年内不会更改。那么你如何改变呢?好吧,每次修改文件时,校验和都会发生变化。浏览器看到一个不同的.js文件,并被迫下载它。以前的文件没用,但浏览器会保留一年(我们不在乎)。

通过这种方式,您可以结合积极的缓存和快速更改(浏览器缓存旧JavaScript但使用新的HTML等没有问题。)

  

脚本标记的src attr,首先转到js文件的缓存

是的,如果已下载此JavaScript文件,浏览器将使用缓存。这实际上有点复杂。如果您上次返回Expires标题,则浏览器甚至不会触及您的服务器。如果您只返回Last-Modifed标题,浏览器将发出所谓的条件GET - 如果文件发生更改,服务器将仅返回新内容,否则将返回304 Not Modified

答案 1 :(得分:2)

托马斯击中头部......除了有一个更简单的解决方案:-)根本不要更改文件的文件名;只需更改指向它们的链接,特别是“搜索”部分。并且您实际上不需要校验和,您也可以在源代码管理系统中使用递增数字或当前版本号

换句话说:

<script src='myFile.js'/>

将是:

<script src='myFile.someChecksum.js'/>
正如托马斯所描述的那样;如果相反,你会这样做:

<script src='myFile.js?x=someChecksum'/>

浏览器仍会将其视为新文件(校验和更改时),但您不必每次都更改文件名。如果使用修订号,您甚至不必每次都计算校验和,只需要服务器端逻辑即可:

<script src='myFile.js?x={{currentRevisionNumber}}'/>