3

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

谢谢

4

2 回答 2

2

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

<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">

(所以使用@machineghost在这里描述的技术)。

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

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

script标签的src attr,js文件先去缓存

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

于 2012-08-28T17:50:58.673 回答
2

Tomasz 一针见血……除了有一个更简单的解决方案 :-) 根本不要更改文件的文件名;只需更改指向它们的链接,特别是“搜索”部分。而且您实际上并不需要校验和,您也可以在源代码控制系统中使用递增数字或当前修订号

换句话说:

<script src='myFile.js'/>

将会:

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

正如 Tomasz 所描述的那样;如果你这样做:

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

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

<script src='myFile.js?x={{currentRevisionNumber}}'/>
于 2012-08-28T17:55:39.107 回答