Jekyll 的 Cache API(使用缓存接口,高速生成)

17 August 2018 pathawks pathawks

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)

Next