Jekyll:生成一次包含并将其包含到所有页面

Posted

技术标签:

【中文标题】Jekyll:生成一次包含并将其包含到所有页面【英文标题】:Jekyll: Generate an include once and include it to all pages 【发布时间】:2015-08-11 22:44:45 【问题描述】:

TL;DR:我可以说以某种方式为 % include % 生成一次内容,然后在多个位置将其标记出来,而不必在每个位置重新生成它吗?

我正在使用 Jekyll 构建一个相当大的文档站点,目前有超过 50 篇文章。它有一个侧边栏,其中列出了所有文章。侧边栏内置在单独的 sidebar.html 中,然后包含在网站上的每个页面中,默认.html 中有 % include sidebar.html %

我遇到的问题是每篇文章都单独运行 sidebar.html 的生成,所以我对那段代码有超过 50 代传递。我添加的每篇文章都为此添加了另一个传递,并使所有传递变得更慢,因为生成侧边栏必须解析项目中的每篇文章。

构建时间已经从基本上为零增加到超过 100 秒,如果我删除 % include sidebar.html %,它会下降到 5 秒。当我得到所有文章时,我估计大约有 100-200 篇。然后我应该在未来对所有文章进行版本控制,这意味着从长远来看很容易有 1000 多篇文章。那时,如果更改一个文件中的一个字母需要大约一个小时来重新生成 jekyll servejekyll build 中的文件,我不会感到惊讶。

我想做的是在构建过程开始时构建一次sidebar.html,并在我生成所述页面时将其标记到每个页面。这可能吗?

【问题讨论】:

生成一个包含 50 篇文章的目录并不需要很长时间。你能显示你包含的代码吗? 我把它放到了 pastebin 上:pastebin.com/KBKbQr4P。我在那里简短地解释了为什么它会这样做,并指出已经存在一些性能问题,但我还没有找到更好的方法来做到这一点。它分为三个部分。任何关于如何更好地做到这一点的建议也很感激。 这是一个实用的目录!今晚我会去挖掘。 漂亮的液体代码。我知道生成它可能需要很长时间。我已经尝试了几乎相同的 1000 页,这是一场噩梦。我显然在纯液体中找不到解决方法。您的工作流程是否可以支持插件或 rake 任务? 当然可以,但我不熟悉这些。此外,一切都非常开放,因此我可以更改它的生成方式。我想到了一次性生成,因为我可以在 javascript 代码中应用突出显示和样式。 【参考方案1】:

最快的方法。

_includes/sidebar.html 移动到sidebar-template.html

添加前面的内容:

---
layout: null
permalink: sidebar-template.html
---

创建Rakefile

TPL = "_site/sidebar-template.html"
TST = "_includes/sidebar.html"

task :default => :nav

desc "Generates sidebar then copy it to be used as an include"
task :nav do

  if !File.exist?(TST)
    puts "Creating dummy #TST file"
    open(TST, 'w') do |f|
      f.puts warning
    end
  end

  puts "Building Jekyll 1st run"
  system "jekyll build --trace"

  # delete target file (TST) if exist
  if File.exist?(TST)
      puts "#TST exists deleting it"
      rm TST
  end

  # copy generated file as an include
  cp(TPL, TST)

  puts "Building Jekyll AGAIN"
  system "jekyll build --trace"

  puts "task END"
end

只需运行 rake 即可生成侧边栏。

【讨论】:

这可能有效,但对我来说,解决限制是一种技巧。例如,它会破坏 jekyll serve (侧边栏不会在更改时即时更新)。然而,这是最好的建议,这让我对 Jekyll 如何满足我的需求感到有些困扰。我现在正在构建一个插件来将 site.data 预处理为我需要的格式,这样我就不必在液体中分别为每个页面构建字符串。我注意到这些渲染时间比我预期的要长得多。【参考方案2】:

感谢 Ben Balter,现在有了更好的方法。

而不是:% include yourtemplate.html % 使用:% include_cached yourtemplate.html %

当用于需要构建一次的较大项目时,例如站点层次结构,该项目将被缓存。对于因页面而异的其他项目,您仍然希望像往常一样使用包含。

这里解释的很好:https://github.com/benbalter/jekyll-include-cache

绝对减少网站启动时间!

【讨论】:

以上是关于Jekyll:生成一次包含并将其包含到所有页面的主要内容,如果未能解决你的问题,请参考以下文章

有啥方法可以下载 _blogger_ 主题并将其上传到 _GitHub_ 页面,而不是从头开始编码 **css** 或使用 **jekyll** 主题?

Jekyll定制收藏钩

Jekyll 在生成博客文章时插入额外的代码

Jekyll:在另一个帖子中包含一个帖子

生成 Jekyll Liquid 内容而不包含它(仅来自 JQuery 加载函数)

Jekyll/Liquid - 如何将大块文本添加到 YAML 前端?