2015-05-29 20 views
8

TL; DR: Czy mogę jakoś raz wygenerować zawartość dla {% include %} i wytłaczać ją w wielu miejscach bez konieczności jej regeneracji w każdym miejscu?Jekyll: Wygeneruj jeden element włączający i dołącz go do wszystkich stron.

Buduję dość dużą stronę dokumentacji z Jekyll, która ma teraz ponad 50 artykułów na ten temat. Ma pasek boczny, na którym znajdują się wszystkie artykuły. Pasek boczny jest budowany w osobnym pliku sidebar.html, a następnie jest dołączany do każdej strony w serwisie przy pomocy {% include sidebar.html %} w pliku default.html.

Problem polega na tym, że każdy pojedynczy artykuł generuje osobno plik sidebar.html, więc mam ponad 50 generacji przejść na tym kawałku kodu. Każdy dodany artykuł dodaje kolejną przepustkę do tego i sprawia, że ​​wszystkie przejścia są wolniejsze, ponieważ generowanie paska bocznego musi analizować każdy pojedynczy artykuł w projekcie.

Czas budowy wzrósł z praktycznie zerowego do ponad 100 sekund, a jeśli usunę {% include sidebar.html %}, to spadnie do 5 sekund. Kiedy dostanę wszystkie artykuły, które według mnie szacuję na około 100-200 z nich. W przyszłości powinienem mieć wersjonowanie dla wszystkich artykułów, co oznacza, że ​​w dłuższej perspektywie może być z łatwością ponad 1000 artykułów. W tym momencie nie byłbym zaskoczony, gdyby zmiana jednej litery w jednym pliku zajęłaby około godziny, aby zregenerować pliki w jekyll serve i jekyll build.

Chciałbym zbudować sidebar.html raz na początku procesu kompilacji i po prostu wytłaczać go na każdej stronie, kiedy generuję te strony. czy to możliwe?

+0

Generowanie 50-stronicowej zawartości nie zajmuje tak dużo czasu. Czy możesz pokazać kod dla ciebie? –

+1

Wstawiłem na pastebin: http://pastebin.com/KBKbQr4P. Wyjaśniłem tam krótko, dlaczego robi to, co robi, i zauważyłem pewne problemy z perfektem już tam, ale nie mam lepszego sposobu, aby to zrobić. Jest podzielony na trzy części. Sugerujemy także wszelkie sugestie, jak to zrobić lepiej. –

+0

To funkcjonalny spis treści! Wkopię się wieczorem. –

Odpowiedz

1

Teraz jest lepszy sposób, dzięki Benowi Balterowi.

zamiast: {% obejmują yourtemplate.html%} zastosowanie: {% include_cached yourtemplate.html%}

Kiedy używany na większych przedmiotów, które muszą być budowane raz, takich jak witryny hierarchia, element zostanie zbuforowany. W przypadku innych elementów, które różnią się na różnych stronach, nadal będziesz korzystać z załączników, tak jak zawsze.

Jest dobrze wyjaśnione tutaj: https://github.com/benbalter/jekyll-include-cache

Zdecydowanie skraca czas uruchamiania site!

4

Najszybszy sposób na zrobienie tego.

Move _includes/sidebar.html do sidebar-template.html

Dodaj przednią sprawę:

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

Tworzenie 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 

Wystarczy uruchomić rake i masz swój pasek boczny obejmują wygenerowany.

+0

To może zadziałać, ale dla mnie jest to hak do obejścia ograniczeń. Przełamie na przykład serwer jekyll (pasek boczny nie będzie aktualizowany w locie po zmianach). Jest to jednak najlepiej zasugerowane, co sprawia, że ​​jestem trochę zaniepokojony tym, jak Jekyll pasuje do moich potrzeb. Buduję wtyczkę, aby przetworzyć {{site.data}} na format, który jest mi potrzebny, tak aby nie musiałem tworzyć ciągów dla każdej strony osobno w płynie. Zauważyłem, że to podniosło czas renderowania o wiele bardziej, niż się spodziewałem. –

Powiązane problemy