【问题标题】:Jekyll: Generate an include once and include it to all pagesJekyll:生成一次包含并将其包含到所有页面
【发布时间】: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 代码中应用突出显示和样式。

标签: html include jekyll liquid


【解决方案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

绝对减少网站启动时间!

【讨论】:

    猜你喜欢
    • 2022-01-17
    • 2015-07-08
    • 2012-09-15
    • 2015-12-19
    • 1970-01-01
    • 1970-01-01
    • 2013-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多