2015-05-29 30 views
8

TL; DR: Tôi có thể nói bằng cách nào đó để tạo nội dung cho một {% include %} một lần và chỉ đóng dấu ở nhiều nơi mà không cần phải tạo lại nó ở mọi vị trí?Jekyll: Tạo một bao gồm một lần và bao gồm nó cho tất cả các trang

Tôi đang xây dựng trang web tài liệu khá lớn với Jekyll hiện có hơn 50 bài viết trên đó. Nó có một thanh bên, nơi tất cả các bài viết được liệt kê. thanh bên được xây dựng trong một sidebar.html riêng biệt và sau đó nó được đưa vào mỗi trang trên trang web với {% include sidebar.html %} trong default.html.

Vấn đề tôi gặp phải là mỗi bài viết đều chạy thế hệ sidebar.html một cách riêng biệt, vì vậy tôi có hơn 50 lần truyền thế hệ trên đoạn mã đó. Mỗi bài viết tôi thêm vào thêm một pass cho điều này và làm cho tất cả các pass chậm hơn một chút, vì việc tạo ra sidebar phải phân tích từng bài viết trong dự án.

Thời gian xây dựng đã tăng từ 0 về cơ bản lên hơn 100 giây rồi, và nếu tôi xóa {% include sidebar.html %} thì nó sẽ giảm xuống còn 5 giây. Khi tôi nhận được tất cả các bài viết trong tôi ước tính có khoảng 100-200 trong số họ. Sau đó, tôi nên có phiên bản trong tương lai cho tất cả các bài viết có nghĩa là có thể dễ dàng được 1000 bài viết trong thời gian dài. Tại thời điểm đó, tôi sẽ không ngạc nhiên nếu thay đổi một chữ cái trong một tệp sẽ mất khoảng một giờ để tạo lại các tệp trong jekyll servejekyll build.

Điều tôi muốn làm là xây dựng sidebar.html một lần trong phần đầu của quá trình xây dựng và chỉ đóng dấu cho mỗi trang khi tôi tạo trang đã nói. Điều này có thể không?

+0

Tạo bảng nội dung 50 bài viết không mất quá nhiều thời gian. Bạn có thể hiển thị mã cho bạn bao gồm không? –

+1

Tôi đặt nó lên trên pastebin: http://pastebin.com/KBKbQr4P. Tôi đã giải thích ngắn gọn tại sao nó làm những gì nó làm và lưu ý một số vấn đề về perfo đã có, nhưng tôi đã không tìm ra cách tốt hơn để làm điều đó. Nó được chia thành ba phần. Mọi đề xuất về cách làm tốt hơn cũng được đánh giá cao. –

+0

Đó là một bảng chức năng của nội dung! Tôi sẽ đào vào tối nay. –

Trả lời

1

Hiện tại có cách tốt hơn để làm điều này, nhờ Ben Balter.

thay vì: {% bao gồm yourtemplate.html%} sử dụng: {% include_cached yourtemplate.html%}

Khi được sử dụng vào các mặt hàng lớn mà cần phải được xây dựng một lần, chẳng hạn như một trang web phân cấp, mục sẽ được lưu vào bộ nhớ cache. Đối với các mục khác thay đổi trên các trang, bạn sẽ vẫn muốn sử dụng bao gồm như bạn đã làm.

Điều này được giải thích rõ ràng tại đây: https://github.com/benbalter/jekyll-include-cache

Chắc chắn sẽ giảm thời gian khởi động trang web!

4

Cách nhanh nhất để thực hiện việc này.

Move _includes/sidebar.html để sidebar-template.html

Thêm vấn đề mặt trận này:

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

Tạo một 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 

Chỉ cần chạy rake và bạn có sidebar của bạn bao gồm tạo ra.

+0

Điều này có thể làm việc nhưng với tôi nó là một hack để làm việc xung quanh những hạn chế. Nó sẽ phá vỡ cho ví dụ jekyll phục vụ (sidebar sẽ không được cập nhật trên bay về thay đổi). Tuy nhiên đó là gợi ý tốt nhất, điều này làm tôi hơi bối rối về cách Jekyll phù hợp với nhu cầu của tôi. Tôi đang xây dựng một plugin ngay bây giờ để xử lý trước {{site.data}} thành định dạng mà tôi cần để tôi không phải tạo chuỗi cho từng trang riêng biệt trong chất lỏng. Tôi nhận thấy rằng những điều này đã tăng lên rất nhiều so với những gì tôi mong đợi. –

Các vấn đề liên quan