Jekyll 的 Cache API(使用缓存接口,高速生成)
Jekyll 内置缓存接口(Cache API),可以加快站点生成速度。缓存接口既可以在内部使用又可以在插件中使用。
缓存在构建过程中保持不变,当 Jekyll 检测到 _config.yml
发送修改时会自动清除缓存。
Jekyll::Cache.new(name) → new_cache
如果已创建了缓存 name
,则返回对现有缓存的引用。否则创建一个一个新的缓存 name
。
如果缓存在 Gem 打包的插件使用,name
应该是 Gem 的名称,当插件包含多个缓存,则使用 Gem 名称开头后面加上 ::
再添加缓存命名。如果缓存在 Jekyll 内部使用,则 name
应该使用该缓存类(Class)的名称(如:"Jekyll::Converters::Markdown"
)。
缓存对象使用相同 name
创建时缓存之间共享。不同名称的缓存之间不共享,在 Jekyll::Cache.new("a")
中可以存储 key 为 1
的对象,在 Jekyll::Cache.new("b")
中也可以存储 key 为 1
的对象,,他们不会指向同一个缓存对象,这样就不需要 key
在全局是唯一的。
getset(key) {block}
这是使用缓存的最常见方法。
block
为一段需时间来计算的代码,但给定特定输入(例如将Markdown转换为HTML)时总是生成相同的输出。 key
是唯一标识函数输入的字符串 String
(或带有 to_s
对象)。
如果缓存中已存在 key
,则返回它,永远不会执行 block
。如果缓存中不存在 key
,则执行 block
,并将结果添加到缓存中并返回。
def cache
@@cache ||= Jekyll::Cache.new("ConvertMarkdown")
end
def convert_markdown_to_html(markdown)
cache.getset(markdown) do
expensive_conversion_method(markdown)
end
end
以上示例,对于 markdown
的输入, expensive_conversion_method
将只调用一次。如果 convert_markdown_to_html
使用相同的输入,则直接返回缓存输出。
每次构建文章一般是不会变,因此避免每次构建重复执行计算未改变的内容。
清除缓存 clear
将从特定缓存中清除所有缓存对象,缓存在内存和硬盘都将为空。
以下方法只能在特殊情况下使用
cache[key] → value
从缓存中获取 key
并返回它的 value
(值),如果缓存中不存在 key
则引发异常。
cache[key] → value
cache[key] = value
将 value
添加到缓存的 key
中。不返回任何内容。
cache[key] = value
key 为 true 或者 false
如果缓存已存在, key
返回 true
。否则为 false
。
key?(key) → true or false
删除 key
在缓存中删除 key
,不会返回任何 内容。
delete(key)