2015-05-29 44 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}}到我需要的格式,這樣我就不必爲每個頁面分別在液體中構建字符串。我注意到這些提升了渲染時間,超出了我的預期。 –