使用nanoc缓存破坏

时间:2013-01-24 19:03:15

标签: nanoc

如何使用Nanoc实现缓存清除?

例如,将MD5校验和添加到HTML和CSS文件上的所有image / font / js / etc资源链接。例如,如果我有index.htmlimages/badger.jpg,我希望页面上的图片链接更改为

`href="images/badger.jpg?12345"`

假设12345将是badger.jpg的正确MD5哈希值。

2 个答案:

答案 0 :(得分:2)

你可以采用路由方式。我建议使用实际上不同的文件名而不是查询字符串 - 一些http缓存不会使用查询字符串缓存网址。

route '/stylesheet/' do
  csum = [File.open(item[:filename]).read.checksum]
  # add other files you include from your stylesheet.less (if you use less)
  csum += Dir['content/styles/*'].select { |i| File.file?(i) }.map { |f| File.read(f).checksum }
  '/style-' + csum.checksum + '.css'
end

route '*' do
  ext = item[:extension]
  versionexts = ['css','js']

  if versionexts.include?(ext)
    # versioned filenames, depending on the checksum of the source file
    # these files shouldn't depend on other sources, or you have to checksum them too (see above)
    item.identifier.chop + '-' + File.read(item[:filename]).checksum + '.' + ext
  elsif item.binary?
    # Write item with identifier /foo/ to /foo.ext
    item.identifier.chop + '.' + ext
  else
    # Write item with identifier /foo/ to /foo/index.html
    item.identifier + 'index.html'
  end
end

您无法在路由中使用生成内容的校验和,因为路由是在编译之前完成的。

答案 1 :(得分:2)

Arjan van der Gaag专门为此制作了一个宝石:https://github.com/avdgaag/nanoc-cachebuster

To quote the man himself

  

用法很简单,因为您只需要安装gem:

$ gem install nanoc-cachebuster 
     

并要求宝石并包括   帮助者开始:

# in default.rb
require 'nanoc3/cachebuster' 
include Nanoc3::Helpers::CacheBusting 
     

您现在可以使用#fingerprint方法   在您的路由规则中:

route '/assets/styles/' do
  item.identifier.chop + fingerprint(item) + '.' + item[:identifier]
end
     

gem会确保您编译时对指纹文件的引用会更新   站点。