2015-05-29 8 views
8

टीएल; डीआर: क्या मैं किसी भी तरह से {% include %} के लिए सामग्री उत्पन्न करने के लिए कह सकता हूं और बस इसे हर जगह में पुन: उत्पन्न किए बिना कई स्थानों पर मुद्रित कर सकता हूं?जेकिल: एक बार एक बार शामिल करें और इसे सभी पृष्ठों में शामिल करें

मैं जेकील के साथ एक काफी बड़ी प्रलेखन साइट का निर्माण कर रहा हूं जिसमें अभी 50 से अधिक लेख हैं। इसमें एक साइडबार है जहां सभी लेख सूचीबद्ध हैं। साइडबार एक अलग sidebar.html में बनाया गया है और फिर इसे साइट पर प्रत्येक पृष्ठ में {% include sidebar.html %} डिफ़ॉल्ट.html में शामिल किया गया है।

मेरी समस्या यह है कि प्रत्येक लेख साइडबार.html की पीढ़ी को अलग करता है, इसलिए मेरे पास कोड के उस टुकड़े पर 50 से अधिक पीढ़ी गुजरती हैं। प्रत्येक लेख जो मैं जोड़ता हूं, वह एक और पास जोड़ता है और सभी पास थोड़ा धीमा कर देता है, क्योंकि साइडबार को प्रोजेक्ट में प्रत्येक लेख को पार्स करना पड़ता है।

बिल्ड समय मूल रूप से शून्य से 100 सेकंड पहले से बढ़ गया है, और यदि मैं {% include sidebar.html %} को हटा देता हूं तो यह 5 सेकंड तक गिर जाता है। जब मैं सभी लेख प्राप्त करता हूं तो मुझे लगता है कि उनमें से लगभग 100-200 हैं। तो मुझे भविष्य में सभी लेखों के लिए संस्करण होना चाहिए जिसका अर्थ है कि लंबे समय तक आसानी से 1000+ लेख हो सकते हैं। उस बिंदु पर मुझे आश्चर्य नहीं किया जाएगा कि एक फ़ाइल में एक अक्षर को बदलने से jekyll serve और jekyll build में फ़ाइलों को पुन: उत्पन्न करने के लिए कुछ घंटे लगेंगे।

मैं क्या करना चाहता हूं कि निर्माण प्रक्रिया की शुरुआत में साइडबार.html बनाने के लिए और केवल पेजों को उत्पन्न करते समय इसे हर पृष्ठ पर मुद्रित करें। क्या यह संभव है?

+0

सामग्री की 50 लेख तालिका उत्पन्न करने में इतना समय नहीं लगता है। क्या आप अपने लिए कोड दिखा सकते हैं? –

+1

मैंने इसे पेस्टबिन पर रखा: http://pastebin.com/KBKbQr4P। मैंने संक्षेप में समझाया कि यह ऐसा क्यों करता है जो कुछ करता है और पहले से ही कुछ perfo मुद्दों पर ध्यान दिया, लेकिन मुझे ऐसा करने का एक बेहतर तरीका नहीं है। यह तीन भागों में बांटा गया है। बेहतर तरीके से कैसे करें इस पर कोई सुझाव भी सराहना की जाती है। –

+0

यह सामग्री की एक कार्यात्मक तालिका है! मैं इस शाम को खोदूँगा। –

उत्तर

1

बेन बाल्टर के लिए धन्यवाद, ऐसा करने का अब एक बेहतर तरीका है।

के बजाय: {% शामिल yourtemplate.html%} उपयोग:

जब बड़ा आइटम, इस तरह के एक साइट के रूप में एक बार निर्मित होने की जरूरत है कि पर इस्तेमाल किया {% yourtemplate.html% include_cached} पदानुक्रम, आइटम कैश किया जाएगा। पृष्ठों पर भिन्न होने वाली अन्य वस्तुओं के लिए, आप अभी भी शामिल किए गए उपयोगों का उपयोग करना चाहेंगे जैसा आपने हमेशा किया है।

यह अच्छी तरह से यहाँ समझाया गया है: 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 सेवा (साइडबार परिवर्तन पर फ्लाई पर अद्यतन नहीं किया जाएगा)। हालांकि यह सबसे अच्छा सुझाव दिया गया है, जो मुझे जेकिल मेरी आवश्यकताओं के अनुरूप फिट करने के बारे में थोड़ा परेशान करता है। मैं अब जिस प्रारूप की आवश्यकता है उस प्रारूप में {{site.data}} को प्रीप्रोसेस करने के लिए एक प्लगइन खरीद रहा हूं ताकि मुझे तरल में अलग-अलग पृष्ठ के लिए स्ट्रिंग बनाने की आवश्यकता न हो। मैंने देखा कि इन्हें प्रस्तुत करने का समय जितना अधिक होगा, उतना ही अधिक होगा। –

संबंधित मुद्दे