版本控制和缓存静态文件:CSS,JS,图像 - 需要考虑的因素

时间:2012-03-07 10:11:56

标签: caching http-caching

对于(企业)Web项目,我希望保留以前版本的静态文件,以便项目在准备好实现设计更改时可以自行决定。我的初步计划是提供静态内容的文件夹,如下所示:

company.com/static/1.0.0/
company.com/static/1.0.0/css/
company.com/static/1.0.0/js/
company.com/static/1.0.0/images/
company.com/static/2.0.0/
company.com/static/2.0.0/css/
company.com/static/2.0.0/js/
company.com/static/2.0.0/images/

这些文件夹中的每个文件都应该具有“永久”缓存的缓存策略 - 至少一年。我还计划将css文件和js文件连接成一个,以便最小化请求数。

然后我还会提供一个current文件夹(符合最新发布版本的符号链接)

company.com/static/current/
company.com/static/current/css/
company.com/static/current/js/
company.com/static/current/images/

这将解决我的第一个问题(项目和子网站可以将代码锁定到某个版本,并且只要它们准备好就可以升级。)

但后来我可以看到一些缓存问题。现在我不能“只”缓存current文件夹,因为它会针对每个版本进行更改。我的缓存策略应该在该文件夹上。

此外,对于每个版本,大多数静态文件无论如何都不会改变。永久缓存它们是否相关,如果有变化则重命名?

我在这里寻求建议,因为我想知道你在缓存和更改文件之间的最佳平衡。

3 个答案:

答案 0 :(得分:1)

小心HTTP缓存。我前段时间调查了这个。 my blog article on the HTTP caching

答案 1 :(得分:1)

您可以选择三种方法:

  1. 使用资源的路径作为缓存密钥,即当它发生变化时 - 浏览器必须下载新版本的资源。在这种情况下,您根本不需要/current文件夹,只需要避免.html页面缓存并在其中放置适当的资源路径。
  2. 您可以将浏览器指向/current文件夹并将ETag添加到您的资源中,在这种情况下,将从客户端发出另一个服务器请求,但它将是条件请求(即If-None-Match标题),因此您可以返回304响应(没有资源主体),直到您的客户决定迁移到另一个版本。此类解决方案的另一个缺点(如果您有多个客户使用不同的版本),/current文件夹将只包含一些单一版本的设计。
  3. 当您要将资源连接到单个文件时,您可以将资源版本指定为URL的一部分:/current/js/combined.js?version=1.0.0.0但这与第一种方法没有太大区别。
  4. 希望这有帮助。

答案 2 :(得分:1)

看看谷歌,微软等公司如何为他们的jQuery CDN实施缓存策略,这可能是值得的。

对于版本化的网址,您的永久缓存政策是可以的。

对于当前的网址,您显然需要更短的到期时间。

要考虑的事情:

  • 应用程序如何能够针对/ current进行测试/即如果他们使用它,您如何知道更改不会破坏现有应用程序?

  • 永远缓存只是为了减少“当前会话”期间的请求,因为大多数浏览器缓存都不足以长时间保存文件(当人们浏览其他网站时,它们会被删除)