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 serve
和 jekyll 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** 主题?