2015-05-29 26 views
8

TL; DR:我可以说某种方式为{% include %}生成一次内容,只需在多个位置生成内容,而无需在每个位置重新生成内容?Jekyll:生成包含一次并将其包含到所有页面

我正与Jekyll建立一个相当大的文档站点,它现在有50多篇文章。它有一个侧栏,列出所有文章。侧边栏内置在一个单独的sidebar.html中,然后将其包含在网站的每个页面中,其中default.html中的内容为{% include sidebar.html %}

我现在的问题是,每一篇文章都单独运行sidebar.html的代,所以我有超过50代的代码片段。我添加的每篇文章都增加了另一个传递,并使所有传递速度稍慢,因为生成侧边栏必须解析项目中的每篇文章。

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

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

+0

生成50篇文章的内容表不需要很长时间。你可以展示你的代码吗? –

+1

我把它放在pastebin:http://pastebin.com/KBKbQr4P。我在那里简单地解释了它为什么会这样做,并注意到已经存在的一些perfo问题,但我还没有找到一个更好的方法来做到这一点。它分为三部分。任何关于如何做得更好的建议也值得赞赏。 –

+0

这是一个内容功能表!我会在今天晚上挖。 –

回答

1

感谢Ben Balter,现在有更好的方法来做到这一点。

代替:{%包括 yourtemplate.html%} 使用:{%include_cached yourtemplate.html%}

当需要进行一次建成较大的物品,如站点使用该项目将被缓存。对于其他页面不同的项目,您仍然希望像以前一样使用这些包含项。

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

绝对减少了现场启动时间!

4

最快的方法来做到这一点。

移动_includes/sidebar.htmlsidebar-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,你有你的侧边栏包括产生。

+0

这可能工作,但对我来说,解决限制是一个窍门。它会打破例如jekyll发球(侧栏不会在更改上随时更新)。然而,这是最好的建议,这让我对Jekyll如何适合我的需求感到有些困惑。 我现在正在建立一个插件来预处理{{site.data}}到我需要的格式,这样我就不必为每个页面分别在液体中构建字符串。我注意到这些提升了渲染时间,超出了我的预期。 –