所以我正在实现这个 js/css 版本控制方案,我基本上在其中附加了 js/css 文件的校验和。我正在考虑的策略是,基本上得到这个校验和值,然后计算文件的校验和(我认为可能来自缓存),如果它们匹配,那么客户端有最新的文件,如果没有那么客户端浏览器将强制从服务器下载该特定文件。这种方法正确吗?另外我想了解脚本标签的行为,比如脚本标签的 src 属性,是先去缓存 js 文件还是直接去网络服务器?
谢谢
所以我正在实现这个 js/css 版本控制方案,我基本上在其中附加了 js/css 文件的校验和。我正在考虑的策略是,基本上得到这个校验和值,然后计算文件的校验和(我认为可能来自缓存),如果它们匹配,那么客户端有最新的文件,如果没有那么客户端浏览器将强制从服务器下载该特定文件。这种方法正确吗?另外我想了解脚本标签的行为,比如脚本标签的 src 属性,是先去缓存 js 文件还是直接去网络服务器?
谢谢
好吧,在现实生活中它实际上更简单。您将一些唯一的校验和附加到 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
否则。
Tomasz 一针见血……除了有一个更简单的解决方案 :-) 根本不要更改文件的文件名;只需更改指向它们的链接,特别是“搜索”部分。而且您实际上并不需要校验和,您也可以在源代码控制系统中使用递增数字或当前修订号
换句话说:
<script src='myFile.js'/>
将会:
<script src='myFile.someChecksum.js'/>
正如 Tomasz 所描述的那样;如果你这样做:
<script src='myFile.js?x=someChecksum'/>
浏览器仍将其视为新文件(当校验和更改时),但您不必每次都更改文件名。如果您使用修订号,您甚至不必每次都计算校验和,您只需要服务器端逻辑即可:
<script src='myFile.js?x={{currentRevisionNumber}}'/>