2015-05-29 13 views
8

TL; DR: Bir şekilde bir {% include %} için bir içerik oluşturup, her yerde yeniden üretmek zorunda kalmadan bir çok yere damgalayabileceğimi söyleyebilir miyim?Jekyll: Bir kez bir tane oluşturun ve tüm sayfalara ekleyin

Şu anda 50'den fazla makalesi olan Jekyll ile oldukça büyük bir dokümantasyon sitesi yapıyorum. Tüm makalelerin listelendiği bir kenar çubuğu vardır. kenar çubuğu ayrı bir sidebar.html içinde oluşturulur ve daha sonra sitenin her sayfasına {% include sidebar.html %} default.html ile eklenir.

Sahip olduğum sorun, her bir makalenin ayrı olarak sidebar.html neslini çalıştırmasıdır, bu yüzden bu kod parçasından 50 jenerasyon geçişim var. Eklediğim her makale, bir geçiş daha ekler ve tüm geçişleri biraz daha yavaş yapar, çünkü kenar çubuğunun oluşturulması projedeki her bir makaleyi ayrıştırmak zorundadır.

Oluşturma süresi temel olarak sıfırdan 100 saniyeye kadar çıktı ve {% include sidebar.html %}'u kaldırırsam 5 saniyeye düşer. Bütün makaleleri aldığımda, bunların 100-200 civarında olduğunu tahmin ediyorum. Öyleyse gelecekte tüm makalelerde versiyonlama yapmalıyım, bu da uzun vadede kolaylıkla 1000+ makale olabileceği anlamına gelir. Bu noktada, bir dosyada bir harf değiştirilirse, jekyll serve ve jekyll build dosyalarının yeniden oluşturulması için bir saat gibi bir şey alacak olursam şaşırmazdım.

Yapmak istediğim şey, yapım sürecinin başında bir kez sidebar.html oluşturmak ve söz konusu sayfaları oluşturduğumda her sayfaya yapıştırmak. Mümkün mü?

+0

50 makale içerikli bir tablo oluşturmak çok uzun sürmez. İçerdiği kodu gösterebilir misin? –

+1

Ben macun macunun üzerine koydum: http://pastebin.com/KBKbQr4P. Orada kısaca açıkladım ne yaptığını ve orada zaten bazı perfo sorunları kaydetti, ama bunu yapmak için daha iyi bir yol bulamadım. Üç bölümden oluşmaktadır. Bunu nasıl daha iyi yapacağınıza dair herhangi bir öneri de takdir edilmektedir. –

+0

Bu, işlevsel bir içerik tablosu! Bu akşam kazacağım. –

cevap

1

Şimdi bunu yapmanın daha iyi bir yolu var, Ben Balter. yerine

: {dahil% yourtemplate.html%} kullanım: Böyle bir site olarak bir kez inşa edilmesi gereken büyük öğeleri temel kullanıldığında

{% yourtemplate.html% include_cached} hiyerarşi, öğe önbelleğe alınacak. Sayfalar arasında değişiklik gösteren diğer öğeler için, her zaman yaptığınız gibi kullanmaya devam etmek isteyeceksiniz.

Iyi burada açıklanmıştır: https://github.com/benbalter/jekyll-include-cache

Kesinlikle sitesi başlatma zaman azalır!

4

Bunu yapmanın en hızlı yolu.

Taşı _includes/sidebar.html

sidebar-template.html bu ön konuyu ekleyin:

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

bir 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 

Sadece rake çalıştırmak oluşturun ve oluşturulan içerir Kenar çubuğunuzu var.

+0

Bu işe yarayabilir ama benim için sınırlamalarla uğraşmak bir hack. Örneğin jekyll hizmetini kesecektir (kenar çubuğu değişikliklerin anında güncellenmeyecektir). Ancak, Jekyll'in gereksinimlerime nasıl uyduğu konusunda beni biraz rahatsız eden, en iyi önerilen şeydir. Şu anda {{site.data}} önişlemini ihtiyacım olan formata dönüştürmek için şimdi bir eklenti yapıyorum, böylece her sayfa için dizeleri ayrı ayrı sıvı içinde oluşturmak zorunda kalmam. Bunların, ayırma zamanını beklediğimden çok daha fazla artırdığını fark ettim. –