เจาะลึกลงไปในตัวสร้างไซต์คงที่สิบเอ็ดสิบ

เผยแพร่แล้ว: 2022-03-10
สรุปโดยย่อ ↬ Eleventy (aka 11ty) กำลังเพิ่มขึ้นในกลุ่มเครื่องมือสร้างไซต์แบบคงที่ ตัวสร้างแบบใช้โหนดนี้มีความน่าสนใจเนื่องจากมีจุดเริ่มต้นที่ไม่มีการกำหนดค่า เอาต์พุตแบบสแตติกล้วนๆ และความง่ายดายในการบรรลุคะแนนประสิทธิภาพสูงสุดของ Lighthouse ที่ 100 คะแนนเต็มสี่สี่ มาดูกันว่ามีอะไรอีกบ้างที่ทำให้มันไม่เหมือนใคร และเรียนรู้เกี่ยวกับแนวคิดที่สำคัญบางอย่างเพื่อช่วยให้คุณประสบความสำเร็จในการเริ่มต้น

แต่ก่อนอื่น มาทบทวนกันอย่างรวดเร็วว่า "ไซต์คงที่" หมายถึงอะไร และจากนั้นเครื่องกำเนิดไฟฟ้ามีให้อะไร ไซต์แบบคงที่ประกอบด้วยเนื้อหาแบบคงที่ เช่นเดียวกับใน HTML, CSS, เนื้อหา และเนื้อหาทั้งหมดได้รับการรวบรวมไว้ด้วยกันก่อนที่จะส่งไปยังโฮสต์ของเว็บไซต์ ซึ่งแตกต่างจากไซต์แบบไดนามิกที่รวบรวมสิ่งเหล่านั้นจากการสืบค้นฐานข้อมูลในขณะใช้งาน (เช่น WordPress) หรือที่ดึงเนื้อหาจากฝั่งไคลเอ็นต์ API (เช่นเฟรมเวิร์ก JavaScript ที่ไม่มีการแสดงผลฝั่งเซิร์ฟเวอร์)

ตัวสร้างไซต์แบบคงที่คือสภาพแวดล้อมและสร้างตัวประมวลผลเพื่อรวบรวมเนื้อหาของคุณให้เป็น HTML แบบคงที่ พวกเขามักจะเสนอตัวช่วยเพื่อให้มีความยืดหยุ่นในการเขียนเนื้อหาของคุณ (เช่น สนับสนุน Markdown) และรวมถึงวิธีการสำหรับการสร้างแม่แบบ ดังนั้นแทนที่จะเขียนหน้า HTML ทีละหน้าและต้องคัดลอกและวางส่วนที่ซ้ำกัน ตัวสร้างจะสนับสนุนการแบ่งสิ่งเหล่านั้นออกเป็นส่วนประกอบผ่านภาษาเทมเพลตบางตัว จากนั้น กระบวนการสร้างของเครื่องกำเนิดไฟฟ้าจะนำทุกอย่างมารวมกันและส่งออก HTML สุดท้ายที่สามารถอัปโหลดไปยังโฮสต์เว็บเพื่อใช้เป็นเว็บไซต์ของคุณได้ ขึ้นอยู่กับโฮสต์เว็บที่คุณใช้ กระบวนการสร้างนี้สามารถทำได้โดยโฮสต์

มีเครื่องกำเนิดไซต์แบบคงที่จำนวนมาก คุณอาจเคยได้ยินหรือเคยใช้ของอย่าง Jekyll, Hugo, Gatsby, Next และ Nuxt Jamstack.org จัดทำรายการที่ครอบคลุม

อะไรทำให้ Eleventy แตกต่างจากเครื่องกำเนิดไซต์แบบคงที่อื่น ๆ

Eleventy นั้นเร็วเป็นพิเศษทั้งระหว่างบิลด์และในเบราว์เซอร์ ส่วนใหญ่ต้องขอบคุณที่ไม่ต้องการโหลดกลุ่ม JavaScript ฝั่งไคลเอ็นต์เพื่อให้บริการเนื้อหา (เทียบกับบางอย่างเช่น Gatsby) การเรนเดอร์ฝั่งเซิร์ฟเวอร์ไม่ใช่เรื่องที่ต้องกังวล เนื่องจากการสร้างหน้าระบบไฟล์มีค่าเริ่มต้นเป็น HTML แบบคงที่

สิ่งที่ทำให้ Eleventy ไม่เหมือนใครจริงๆ คือความสามารถในการเลือกและผสมภาษาเทมเพลตต่างๆ ได้มากถึง สิบ ภาษา:

สกรีนช็อตจากเอกสารประกอบของ 11ty.dev ซึ่งแสดงรายการภาษาของเทมเพลตที่มีอยู่รวมถึง HTML, Markdown, JavaScript, Liquid, Nunjucks Handlebars, หนวด, EJS, Haml และ Pug
สกรีนช็อตจากเอกสารประกอบของ 11ty.dev ซึ่งแสดงรายการภาษาของเทมเพลตที่มีอยู่รวมถึง HTML, Markdown, JavaScript, Liquid, Nunjucks Handlebars, หนวด, EJS, Haml และ Pug (ตัวอย่างขนาดใหญ่)

การผสมผสานภาษาสามารถเกิดขึ้นได้ในไฟล์เดียวกันหรือระหว่างเลย์เอาต์ ตัวอย่างเช่น ฉันมักจะเขียนเนื้อหาหลักด้วย Markdown ที่ป้อนลงในเลย์เอาต์ของ Nunjucks ในบางโปรเจ็กต์ ฉันพบว่าการวนซ้ำข้อมูลโดยใช้ Nunjucks ขณะอยู่ในไฟล์ Markdown นั้นมีประโยชน์ ความสามารถในการรวมภาษานี้มีประสิทธิภาพมาก และช่วยให้คุณสามารถออกแบบเวิร์กโฟลว์การเขียนและสร้างที่เหมาะกับคุณและโครงการของคุณได้ดีที่สุด

Eleventy มีแฟล็ก --serve ที่ใช้ BrowserSync เพื่อเปิดใช้งานการให้บริการไซต์ในเครื่องและมีการโหลดซ้ำเมื่อมีการเปลี่ยนแปลงไฟล์ นี่เป็นความสะดวกอย่างยิ่ง และควรจำไว้เสมอหากคุณไม่ได้มองหาตัวสร้างไซต์แบบสแตติก แต่บางทีอาจอัปเกรดจากเครื่องมือสร้างอย่างอึก

ส่วนหนึ่งของการกำหนดค่าเป็นศูนย์ ไฟล์ไซต์ทั้งหมดของคุณอาจอยู่ในรูทของโปรเจ็กต์ของคุณ หากต้องการแก้ไขไดเร็กทอรีอินพุตและเอาต์พุต คุณสามารถสร้างการกำหนดค่า Eleventy ซึ่งคาดว่าจะเป็นไฟล์รูทชื่อ . .eleventy.js ต่อไปนี้คือข้อมูลโค้ดสั้นๆ ที่แสดงวิธีการแก้ไขนี้:

 module.exports = function (eleventyConfig) { return { dir: { // default: [site root] input: "src", // default: _site output: "public", }, }; };

ตามที่ระบุไว้ก่อนหน้านี้ ลักษณะการทำงานเริ่มต้นคือการสร้างหน้าระบบไฟล์ ซึ่งโดยทั่วไปแล้วจะเป็นประโยชน์อย่างยิ่งโดยเฉพาะอย่างยิ่งสำหรับการเริ่มต้นอย่างรวดเร็ว สิ่งนี้สามารถแทนที่ได้อย่างง่ายดายโดยการกำหนด permalink ที่กำหนดเอง และสามารถทำได้ต่อไฟล์ สำหรับทั้งไดเร็กทอรี หรือไดนามิกสำหรับชุดข้อมูล Permalinks ยังมีมหาอำนาจอื่นที่เราจะสำรวจในอีกสักครู่!

ในระหว่างการสร้าง คุณสามารถเตรียมเนื้อหา ข้อมูล และการแปลงเนื้อหาและข้อมูลนั้นได้โดยใช้ JavaScript และใช้ประโยชน์จากตัวกรองและรหัสย่อ (เราจะพูดถึงในภายหลัง) อีกครั้ง ทั้งหมดนี้เกิดขึ้นโดยไม่ต้องเพิ่มกลุ่มฝั่งไคลเอ็นต์ JavaScript ในขณะที่ยังคงเปิดใช้งานการใช้ JavaScript เป็นภาษาเทมเพลต

หมายเหตุสำคัญ : คุณสามารถใช้ Eleventy ได้สำเร็จโดยมีความรู้ด้าน JavaScript ไม่มากหรือน้อย

ไม่เหมือนกับ SSG อื่น ๆ เช่น Gatsby หรือสภาพแวดล้อมเช่น WordPress ไซต์ Eleventy ส่วนใหญ่ไม่ต้องการปลั๊กอินใด ๆ มีปลั๊กอินบางตัว แต่ไม่จำเป็นสำหรับฟังก์ชันที่จำเป็น

เมื่อสร้างด้วย Eleventy คุณสามารถเพิ่มคุณสมบัติได้ตามต้องการ อันที่จริง คุณสามารถใช้ HTML ได้และไม่เคยทำงานกับภาษาเทมเพลตอื่นๆ เลย Eleventy นั้นซับซ้อนเท่าที่โครงการของคุณต้องการเท่านั้น!

เพิ่มเติมหลังกระโดด! อ่านต่อด้านล่าง↓

การทำความเข้าใจแนวคิดสิบเอ็ดที่สำคัญ

มาดูคำศัพท์และแนวคิดสองสามข้อที่จะช่วยให้คุณประสบความสำเร็จในการสร้างโครงการ Eleventy ของคุณกันดีกว่า

เลย์เอาต์และเทมเพลต

คุณอาจคิดว่าคำศัพท์เหล่านี้ใช้แทนกันได้ แต่ในบริบทของ Eleventy คำเหล่านี้มีความหมายตามบริบท:

  • เทมเพลตเป็นคำทั่วไปสำหรับไฟล์เนื้อหาทั้งหมด
  • เลย์เอาต์คือเทมเพลตพิเศษที่รวมเนื้อหาอื่นๆ

ตัวอย่างเช่น เทมเพลต อ้างอิงถึงไฟล์ Markdown ทั้งหมดของคุณ ในขณะที่ เล ย์เอาต์อาจเป็นไฟล์ Nunjucks ที่มีต้นแบบ HTML5 และช่องสำหรับเนื้อหาเทมเพลต เราจะเรียนรู้วิธีใช้งานในส่วนการเริ่มต้นใช้งาน

ตัวกรองและรหัสย่อ

นี่เป็นวิธีเพิ่มเติมในการแก้ไขผลลัพธ์ของเนื้อหา และสร้างส่วนเทมเพลตที่นำกลับมาใช้ใหม่ได้ ใช้ได้กับการสร้างเทมเพลต Nunjucks, Liquid, Handlebars และ JavaScript ตัวกรองและรหัสย่อถูกกำหนดไว้ใน . .eleventy.js

นอกเหนือจากตัวแปรและโอเปอเรเตอร์ในภาษาเทมเพลตที่คุณเลือกแล้ว Eleventy ยังได้รวมแนวคิดของตัวกรองในภาษาที่แสดงไว้ก่อนหน้านี้เป็นอันหนึ่งอันเดียวกัน ตัวกรองจะแปลงเนื้อหาในลักษณะเฉพาะสำหรับประเภทเนื้อหา ตัวอย่างเช่น คุณอาจสร้างตัวกรองสำหรับสตริงเพื่อเป็นตัวพิมพ์ใหญ่ หรือคุณอาจมีตัวกรองที่ใช้กับอาร์เรย์เพื่อแก้ไขสิ่งที่ส่งคืน เช่น การเลือกรายการแบบสุ่ม ตัวกรองบางตัวมีให้โดย Eleventy ซึ่งบางส่วนเราจะใช้ในบทแนะนำการเริ่มต้นใช้งาน

รหัสย่ออนุญาตให้สร้างส่วนเทมเพลตที่นำกลับมาใช้ใหม่ได้และสามารถยอมรับอาร์กิวเมนต์ได้ พวกเขาสามารถเป็นแบบสแตนด์อโลนหรือจับคู่ได้ หมายความว่าพวกเขาห่อเนื้อหาด้วยแท็กเริ่มต้นและสิ้นสุด

หนึ่งในรหัสย่อที่ฉันชอบคือการแสดงปีปัจจุบัน — หมายถึงปีที่ลิขสิทธิ์ไม่ล้าสมัยอีกต่อไปในส่วนท้ายของคุณ! ต่อไปนี้เป็นวิธีสร้างรหัสย่อ year :

 eleventyConfig.addShortcode("year", () => `${new Date().getFullYear()}`);

หากต้องการใช้ในเทมเพลต Nunjucks หรือ Liquid จะมีลักษณะดังนี้: {% year %}

คุณสามารถตรวจสอบเอกสาร Eleventy เพื่อดูตัวอย่างรหัสย่อที่จับคู่

ของสะสม

คอลเล็กชันคือกลุ่มของเนื้อหาที่เกี่ยวข้อง และโดยทั่วไปจะถูกสร้างขึ้นภายใน frontmatter โดยการกำหนด tags ตัวเลือกไวยากรณ์แท็กประกอบด้วยสตริงเดี่ยว อาร์เรย์บรรทัดเดียว — ["tagA", "tagB"] - สำหรับรายการแบบทวีคูณ หรือรายการสไตล์ YAML เพื่อกำหนดแท็กหลายรายการ ตัวอย่างเช่น ฉันสามารถสร้างคอลเลกชัน "หน้า" โดยเพิ่ม frontmatter ต่อไปนี้ในเนื้อหาทั้งหมดที่ฉันต้องการให้รวมอยู่ในคอลเลกชันนั้น:

 --- tags: pages ---

เมื่อคุณกำหนดคอลเล็กชันแล้ว คุณสามารถเข้าถึงได้ผ่านภาษาเทมเพลตที่คุณเลือกภายในออบเจ็กต์ collections ส่วนกลาง ในการเข้าถึงคอลเล็กชัน "หน้า" ของเราจะมีลักษณะเหมือน collections.pages ซึ่งจะส่งคืนอาร์เรย์ของข้อมูลของคอลเลกชันนั้น และเพื่อให้คุณสามารถดำเนินการกับอาร์เรย์ได้ เช่น การวนซ้ำ เช่น เพื่อสร้างรายการลิงก์หรือการ์ดทีเซอร์ของบทความ คุณยังสามารถระงับเอาต์พุตไฟล์ปกติและใช้เฉพาะคอลเลกชันเพื่อจัดการการแสดงข้อมูล ซึ่งมีประโยชน์สำหรับการจัดการเนื้อหาไซต์แบบหน้าเดียว

ข้อมูลที่กำหนดเอง

จนถึงตอนนี้ เราได้พูดคุยเกี่ยวกับการสร้างเนื้อหาเป็นไฟล์ แต่ Eleventy ยังทำให้ง่ายต่อการดูแลรักษาแหล่งข้อมูลต่างๆ สิ่งนี้เรียกว่า "ข้อมูลที่กำหนดเอง" และใช้งานได้เหมือนการส่งออกโมดูล JavaScript หรือไฟล์ JSON ในไดเร็กทอรี _data

ข้อมูลที่กำหนดเองสามารถใช้เพื่อ:

  • กำหนดอาร์เรย์ JSON พื้นฐาน
  • ส่งกลับผลลัพธ์ของการดำเนินการดึงข้อมูล
  • ดึงและจัดรูปแบบเนื้อหาใหม่จาก CMS ที่ไม่มีส่วนหัว

Eleventy ทำให้ข้อมูลทั้งหมดจากภายใน _data พร้อมใช้งานภายใต้ตัวแปรที่ตรงกับชื่อไฟล์ ตัวอย่างเช่น ถ้าฉันสร้าง posts.json ฉันสามารถเข้าถึงสิ่งนั้นได้ในเทมเพลตของฉันเป็น posts เมื่อใช้ Nunjucks นี่คือตัวอย่างของการวนซ้ำข้อมูล posts :

 {% for post in posts %} {{ post.title }} {% endfor %}

การแบ่งหน้าและการสร้างหน้าจากข้อมูล

ในแง่สิบเอ็ด การแบ่งหน้าหมายถึงการวนซ้ำชุดข้อมูลและกำหนดเทมเพลตสำหรับผลลัพธ์ของ "กลุ่ม" ของข้อมูลนั้น สิ่งนี้ทำได้ด้วยไฟล์เฉพาะที่กำหนดการแบ่งหน้าภายใน frontmatter ไฟล์นี้ยังรวมถึงการตั้งค่าเอาต์พุตที่คุณต้องการสำหรับข้อมูล ซึ่งหมายความว่าไฟล์จะกลายเป็นเทมเพลตของตัวเองเช่นกัน เราสามารถกำหนดรูปแบบเพื่อส่งเนื้อหาไปและเพิ่มแท็กเพื่อสร้างคอลเลกชันเพื่อความสะดวกในการอ้างอิงและความยืดหยุ่นสำหรับผลลัพธ์

หมายเหตุ : หากคุณใช้ข้อมูลที่กำหนดเองเพื่อดึงเนื้อหาจาก CMS การแบ่งหน้าเป็นวิธี Eleventy ที่คุณกำลังมองหาเพื่อเปลี่ยนข้อมูลนั้นเป็นหน้าเว็บแบบไดนามิก

ต่อไปนี้คือตัวอย่างการอ้างอิงข้อมูลที่กำหนดเองของ posts ซึ่งเราจะถือว่าเรากำลังดึงข้อมูลจากการดึงข้อมูลจาก CMS ที่ไม่มีส่วนหัว ที่สำคัญ size ถูกตั้งค่าเป็น 1 ซึ่งหมายความว่า "ส่วนการแบ่งหน้า" แต่ละอันควรสร้างเอาต์พุตหน้าเดียว จากนั้นเราใช้ alias เพื่อสร้างการอ้างอิงไปยังรายการปัจจุบันในลูปการแบ่งหน้า จากนั้นใช้การอ้างอิงนั้นในคำจำกัดความของ permalink และเนื้อหาเทมเพลต

ไฟล์ที่กำหนดการแบ่งหน้าสามารถอยู่ได้ทุกที่ที่คุณต้องการภายในไดเร็กทอรีอินพุตของคุณ การกำหนดลักษณะองค์กรของฉันคือการ generate ไดเร็กทอรีที่สร้าง จากนั้นตั้งชื่อให้เหมือนกับคอลเล็กชันที่จะสร้าง พิจารณาสิ่งต่อไปนี้เพื่อ src/generate/posts.njk :

 --- pagination: data: posts size: 1 alias: post addAllPagesToCollections: true permalink: "/{{ post.title | slug }}/" tags: posts layout: post templateEngineOverride: njk, md --- {{ post.body | safe }}

ในกรณีนี้ permalink จะกำหนดหน้าที่ให้ส่งออกโดยตรงจากรากของไซต์ คุณสามารถเปลี่ยนเพื่อเพิ่มคำนำหน้าเช่น /posts/{{ post.title | slug }} /posts/{{ post.title | slug }} ตัวอย่างเช่น

นอกจากนี้ หากคุณต้องการให้หน้าที่สร้างขึ้นทั้งหมดพร้อมใช้งานในคอลเลกชันที่สร้างโดยแท็ก คุณต้องตั้งค่า addAllPagesToCollections true เพื่อรวมมากกว่ารายการแรก

สุดท้ายนี้ หากเนื้อหาของคุณเข้ามาในรูปแบบ Markdown แทนที่จะเป็น HTML ที่คอมไพล์ล่วงหน้า คุณจะต้องใช้ templateEngineOverride ในตัวอย่างข้อมูลโค้ด ฉันได้ตั้งค่าเป็น njk, md ซึ่งหมายความว่าเนื้อหาเทมเพลตจะต้องได้รับการประมวลผลเป็น Nunjucks เพื่อแปลงตัวแปร จากนั้น Markdown เพื่อคอมไพล์เนื้อหาที่ส่งคืนในตัวแปร

หากคุณสงสัยว่าความ safe หมายถึงอะไร เราจะมาเรียนรู้กันต่อไป!

วิธีเริ่มต้นกับ Eleventy

เอาล่ะ คุณพร้อมแล้วที่จะเริ่มต้นกับโปรเจ็กต์ Eleventy แรกของคุณ! บทช่วยสอนสั้น ๆ นี้จะช่วยให้คุณมีโครงสร้างเริ่มต้นสำหรับสร้างต่อ เราจะใช้แนวคิดที่เราได้เรียนรู้ไปแล้วและเพิ่มแนวคิดใหม่ๆ ด้วยเช่นกัน

หมายเหตุสำคัญประการแรกที่นี่คือ Eleventy เป็นแพ็คเกจที่มีขอบเขต ดังนั้นนี่คือคำสั่งติดตั้ง:

 npm install @11ty/eleventy

ต่อไป ความสะดวกที่ฉันชอบทำคือเพิ่มสคริปต์ต่อไปนี้ใน package.json ของฉัน:

 "scripts": { "start": "eleventy --serve", "build": "eleventy" }

ดังที่ได้กล่าวไว้ก่อนหน้านี้ แฟ --serve จะเปิดใช้งานเซิร์ฟเวอร์ภายในเครื่องผ่าน BrowserSync

ฉันชอบที่จะอัปเดตไดเร็กทอรีอินพุต/เอาต์พุตตามที่เราได้ดูไปแล้ว ดังนั้นตอนนี้ก็ถึงเวลาสร้างเนื้อหาบางส่วนภายใน src หรือไดเร็กทอรีอินพุตที่คุณเลือก

เพื่อเตรียมโครงการของเราให้มีความยืดหยุ่นและปรับขนาดได้ตั้งแต่เริ่มต้น ขอแนะนำให้สร้างอย่างน้อยหนึ่งรูปแบบที่มีต้นแบบ HTML5 จำเป็นต้องกำหนดเลย์เอาต์ภายใน _includes ที่เรียกว่าโดยตรง ซึ่งเป็นหนึ่งในไดเร็กทอรีที่คาดไว้จำนวนหนึ่ง

แบบแผนที่คุณมักจะพบในการเริ่มต้นคือการเรียกรูปแบบ base นี้ ฉันชอบทำให้เป็นไฟล์ Nunjucks

นี่คือตัวอย่าง base.njk :

 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>{{ title }}</title> </head> <body> <header> <h1>{{ title }}</h1> </header> <main> {{ content | safe }} </main> </body> </html>

วงเล็บปีกกาคู่คือไวยากรณ์ Nunjucks สำหรับตัวแปร ที่นี่ เราได้เตรียมไว้สำหรับตัวแปร title ที่เข้ามา ซึ่งจะส่งผ่านทางส่วนหน้าในไม่ช้า ตัวแปร content จัดทำโดย Eleventy และทำเครื่องหมายช่องที่เนื้อหาที่ไม่ใช่ส่วนหน้าที่เข้ามาทั้งหมดควรไป ที่สำคัญ ค่านี้ใช้ร่วมกับตัวกรองที่ safe ที่ให้มา ซึ่งป้องกันไม่ให้ HTML ที่คอมไพล์แล้วถูก Escape และแสดงผล

ตอนนี้ได้เวลาสร้างดัชนีเว็บไซต์ของเรา ซึ่งเราจะเพิ่มเป็น index.md :

 --- title: Hello Smashing Readers! layout: base.njk --- Thanks for reading — hope you're excited to try Eleventy!

สังเกตว่าในส่วนหน้าเราได้เพิ่มชื่อของเราและกำหนดรูปแบบด้วย

ณ จุดนี้ เราสามารถเรียกใช้โครงการของเราด้วยสคริปต์ที่เราเพิ่ม: npm start การดำเนินการนี้จะทริกเกอร์ BrowserSync เพื่อตั้งค่า localhost:8080 (หากมี) แต่คุณจะต้องเปิดด้วยตนเองในเบราว์เซอร์ ดูเคล็ดลับด่วนนี้หากต้องการให้เปิดเบราว์เซอร์โดยอัตโนมัติ

ขั้นตอนสุดท้ายที่สำคัญคือการเพิ่มสไตล์ชีต ขณะนี้ CSS ไม่เป็นที่รู้จักว่าเป็นประเภทไฟล์ที่รวมโดยอัตโนมัติ ดังนั้นเราจะมีขั้นตอนการกำหนดค่าเพิ่มเติมหนึ่งขั้นตอนหลังจากที่เราสร้างสไตล์ชีตของเรา

คุณสามารถเพิ่มไฟล์ CSS ได้ทุกที่ที่ต้องการในไดเร็กทอรีอินพุต เช่น css/style.css จากนั้นเปิด .eleventy.js (หรือสร้างในรูทโปรเจ็กต์หากคุณไม่ได้ปรับแต่งอินพุต/เอาต์พุต) และเพิ่มสิ่งต่อไปนี้

 module.exports = function (eleventyConfig) { eleventyConfig.addPassthroughCopy("./src/css/"); eleventyConfig.addWatchTarget("./src/css/"); // - input/output customization if using - };

ขั้นแรก เราเพิ่มไดเร็กทอรี css เป็น "passthrough copy" ซึ่งหมายความว่า Eleventy ควรรวมไว้ในไดเร็กทอรีพุชไปยังไดเร็กทอรีเอาต์พุต จากนั้นเรายังเพิ่มเป็น "เป้าหมายการดู" เพื่อที่เมื่อเราเปลี่ยนแปลงสไตล์ของเราในขณะที่เรียกใช้คำสั่ง start Eleventy จะทริกเกอร์การสร้างใหม่เพื่ออัปเดตไซต์ในพื้นที่ของเรา

สุดท้ายนี้ เราต้องไม่ลืมที่จะเพิ่มลิงก์ไปยังสไตล์ชีตของเราภายในรูปแบบ base ของเรา:

 <link rel="stylesheet" href="{{ '/css/style.css' | url }}" />

เมื่อเรากำหนดตำแหน่งของสไตล์ชีต เราจะส่งต่อผ่านตัวกรอง url ของ Eleventy ซึ่งจะปรับเส้นทางของไฟล์ที่เกี่ยวข้องตามความจำเป็นในบิลด์

ต่อไป มาสร้างประเภทโพสต์ "หน้า" เพื่อสำรวจโดยใช้คอลเล็กชันและเลย์เอาต์เพิ่มเติมอีกเล็กน้อย ในการดำเนินการนี้ ให้เพิ่มไดเร็กทอรีของ pages และสร้างไฟล์ Markdown หนึ่งหรือสองไฟล์ รวมถึงปุ่ม front-matter key แต่ ไม่ใช่ เล title เอาต์

เราจะใช้วิธีการที่แตกต่างออกไปเล็กน้อยเพื่อกำหนดเลย์เอาต์ในครั้งนี้ — ไฟล์ไดเร็กทอรีข้อมูล ไฟล์นี้มีรูปแบบโดยทั่วไปเป็น JSON และทำให้เราสามารถเพิ่มข้อมูลที่ควรใช้กับไฟล์ทั้งหมดภายในไดเร็กทอรี ซึ่งช่วยป้องกันไม่ให้ต้องทำซ้ำในไฟล์ต่างๆ ไฟล์ต้องมีชื่อเหมือนกับไดเร็กทอรีที่จะใช้ ดังนั้นให้สร้างไฟล์ pages.json และเพิ่มเนื้อหาต่อไปนี้:

 { "layout": "page.njk", "tags": "pages" }

เรายังดำเนินการกำหนดแท็กเพื่อสร้างคอลเลกชัน "หน้า" แต่เลย์เอาต์ที่เรากำหนดยังไม่มีอยู่จริง ดังนั้นให้สร้าง _includes/page.njk แล้วเพิ่มสิ่งต่อไปนี้:

 --- layout: base.njk --- <article> {{ content | safe }} </article>

เราใช้แนวคิด Eleventy ของ การโยงเค้าโครง เพื่อให้สามารถใช้เทมเพลต base ของเราซ้ำได้ แต่ยังเพิ่มองค์ประกอบเฉพาะสำหรับการจัดวาง page ของเรา ซึ่งก็คือ <article> ซึ่งหมายความว่าเนื้อหาทั้งหมดในหน้าของเราจะใช้ทั้งเค้าโครง page และเค้าโครง base

การโยงโครงร่างช่วยลดความซ้ำซ้อนโดยอนุญาตให้นำต้นแบบและโครงสร้างเลย์เอาต์ของไซต์ฐานกลับมาใช้ใหม่ได้

ตอนนี้เราได้สร้างเนื้อหาสำหรับประเภทเนื้อหาของ pages และกำหนดให้เป็นคอลเล็กชัน "หน้า" ผ่านแท็กแล้ว มาดูกันว่าเราสามารถเข้าถึงคอลเล็กชันนั้นได้อย่างไร ในที่นี้ เราจะใช้ Nunjucks เพื่อวนรอบคอลเล็กชันและแสดงรายการลิงก์ไปยังแต่ละหน้า ลูปนี้จะถูกเพิ่มเข้าไปในไฟล์ index.md ของเรา

 {% for post in collections.post -%} - [{{ post.data.title }}]({{ post.url }}) {% endfor %}

เราได้ทำสิ่งที่ไม่เหมือนใครซึ่งก็คือ ด้านใน ของลูปจะสลับกลับไปที่ Markdown เพื่อแสดงลิงก์ นี่ไม่ใช่วิธีที่จำเป็นในการจัดการสถานการณ์นี้ แต่มีประโยชน์มาก! บางครั้งอาจใช้ไม่ได้ผล ทั้งนี้ขึ้นอยู่กับความซับซ้อน เหตุผลที่แท้จริงก็คือตัวแสดงภาพ Markdown ตั้งค่าเริ่มต้นเป็นภาษาเทมเพลต Liquid ดังนั้นหากคุณใช้ฟีเจอร์ Nunjucks ที่นอกเหนือไปจากลูปพื้นฐาน คุณจะต้องแจ้งให้ Eleventy ทราบวิธีดำเนินการกับไฟล์

ในส่วนก่อนหน้าของการแบ่งหน้า เราได้พิจารณาวิธีแก้ปัญหานี้แล้ว และนั่นคือการใช้ประโยชน์จาก templateEngineOverride เพื่อระบุว่าไฟล์ควรได้รับการประมวลผลเป็นทั้ง Nunjucks และ Markdown ควรวางโซลูชันแบบเต็มต่อไปนี้ไว้ในส่วนหน้าของเทมเพลต: templateEngineOverride: njk, md

ณ จุดนี้ คุณได้สร้างไซต์พื้นฐานหลายหน้าแล้ว! หากคุณต้องการใช้ข้อมูลภายนอก ให้ข้ามกลับไปที่ส่วน การแบ่งหน้า

วิธีอื่นในการเริ่มโครงการที่สิบเอ็ด

ในขณะที่เครื่องมือสร้างไซต์และสภาพแวดล้อมแบบสแตติกอื่นๆ เช่น WordPress มีแนวคิดของ "ธีม" แต่ Eleventy ใช้คำว่า "starter" มีคอลเลกชั่นเพิ่มขึ้นเรื่อยๆ ให้เลือก และหลายคอลเล็กชันสามารถพบได้ในรายการภายใน Eleventy docs

ความชอบของฉันคือการใช้ Sass กับโปรเจ็กต์ Eleventy ของฉัน และฉันมี Sass starter ที่พร้อมใช้งานหากคุณต้องการดูวิธีเพิ่มสิ่งนั้นลงในกระบวนการสร้างของคุณ คนอื่นอาจเลือกที่จะเพิ่มในอึกหากพวกเขาคุ้นเคยกับการสร้างไปป์ไลน์สำหรับสินทรัพย์และการประมวลผล

ฉันยังได้สร้างเครื่องมือเริ่มต้นขั้นต่ำที่มีคุณลักษณะต่างๆ ที่กล่าวถึงในบทความนี้ และแชร์ความคล้ายคลึงกันกับผลการสอน นอกจากนี้ยังมีตัวอย่างเล็กๆ ในการดึงข้อมูลภายนอก และแสดงวิธีการเพิ่มบางส่วนเพื่อแสดงการนำทางไซต์ตามคอลเลกชัน

การขยายพื้นฐาน

เมื่อคุณได้ทดลองสร้างไซต์แรกของคุณด้วยเนื้อหาพื้นฐานและอาจมีข้อมูลที่กำหนดเองแล้ว การทราบวิธีเพิ่มเติมในการทำงานกับเนื้อหานั้นมีประโยชน์ นี่คือภาพรวมโดยย่อของแนวคิดอื่นๆ ที่ควรทราบ

การแก้ไขประเภทเอาต์พุตของไฟล์ด้วยลิงก์ถาวร

ฉันได้กล่าวไว้ก่อนหน้านี้ว่าลิงก์ถาวรมีพลังพิเศษ และนั่นคือคุณสามารถใช้มันเพื่อส่งออกประเภทไฟล์ที่ไม่ใช่ HTML

ตัวอย่างที่มีประโยชน์สองตัวอย่างคือการสร้างฟีด RSS และแผนผังเว็บไซต์ ซึ่งทั้งสองอย่างนี้มักเป็นไฟล์ XML สิ่งที่มีประสิทธิภาพจริงๆ คือ คุณสามารถใช้ภาษาเทมเพลตที่คุณเลือกต่อไปเพื่อช่วยสร้างไฟล์เหล่านั้นได้ ดังนั้นคุณจึงสามารถวนซ้ำข้อมูลหน้าด้วย Nunjucks เพื่อให้ฟีด RSS ของคุณสดใหม่อยู่เสมอ เป็นต้น

การปรับแต่งคอลเลกชั่น

บางครั้งการใช้แท็กเพื่อสร้างคอลเลกชันอาจไม่เพียงพอ หรือคุณอาจต้องการสร้างรูปแบบที่กรองแล้วของคอลเลกชันที่มีอยู่ เราสามารถแก้ไขหรือสร้างคอลเลกชันโดยใช้ชุดของฟังก์ชันที่มีให้ สิ่งเหล่านี้จะอยู่ในไฟล์กำหนดค่า . .eleventy.js

ในตัวอย่างนี้ เรากำลังใช้ฟังก์ชัน addCollection เพื่อกรองรายการในคอลเลกชันที่มีอยู่ คอลเลกชั่นใหม่จะขึ้นอยู่กับการมีอยู่ของ customKey ในส่วนหน้า คีย์นี้ส่งคืนจากอ็อบเจ็กต์ data ซึ่งแนบกับเนื้อหา Eleventy ที่สร้างขึ้นทั้งหมด

 eleventyConfig.addCollection("specialCollection", function (collection) { return collection.getAll().filter((post) => post.data.customKey); });

คุณสามารถตรวจสอบวิธีอื่นๆ ในการสร้าง แก้ไข และใช้คอลเลกชั่นได้ในเอกสาร Eleventy

การทำงานกับ Data Cascade

Eleventy มีแนวคิดที่สมบูรณ์มากขึ้นเกี่ยวกับวิธีการรวบรวมข้อมูลสำหรับเทมเพลตที่เรียกว่า data cascade ซึ่งเราเพิ่งเริ่มสำรวจในคู่มือนี้ คุณจะได้รับประโยชน์สูงสุดจาก Eleventy หากคุณทบทวนวิธีการทำงานโดยเริ่มในเอกสาร เบ็น ไมเยอร์สยังมีคำแนะนำที่ดีในการทำความเข้าใจการเรียงซ้อนข้อมูล

ปลั๊กอินสิบเอ็ดที่แนะนำ

ในบทนำ ฉันได้กล่าวถึงสั้น ๆ ว่ามีปลั๊กอิน แต่ไม่จำเป็นเสมอไป อย่างไรก็ตาม มีบางส่วนที่ฉันมักจะใช้ในโครงการส่วนใหญ่ ซึ่งรวมถึง:

  • @11ty/eleventy-plugin-rss หากคุณต้องการฟีด RSS ปลั๊กอินอย่างเป็นทางการนี้มีตัวกรองเพื่อช่วยคุณสร้างฟีด repo ที่เชื่อมโยงมีฟีดตัวอย่าง ซึ่งคุณอาจพบว่ามีการใช้งานอยู่ภายในตัวเริ่มต้นบางตัว
  • @ 11ty/eleventy-plugin-syntaxhighlight แทนที่จะโหลด Prism เป็นสคริปต์สำหรับการเน้นโค้ด ปลั๊กอินนี้อนุญาตให้ใช้การประมวลผลเป็นส่วนหนึ่งของกระบวนการสร้าง Eleventy ซึ่งหมายความว่าบล็อกโค้ดจะถูกแปลงเพื่อรวมคลาสสำหรับการใช้ธีม Prism ล่วงหน้า ดังนั้นคุณจะต้องเพิ่มธีม Prism CSS ที่คุณเลือกเท่านั้น
  • @ 11tyrocks/eleventy-plugin-social-images คุณลักษณะที่ฉันค้นหาในช่วงต้นของการสำรวจ Eleventy ของฉันคือความสามารถในการสร้างภาพแชร์บนโซเชียลมีเดีย สิ่งนี้ทำให้ฉันสร้างปลั๊กอินที่ใช้ Puppeteer อยู่เบื้องหลังเพื่อถ่ายภาพ ปลั๊กอินมาพร้อมกับเทมเพลตที่สร้างไว้ล่วงหน้ารวมถึงตัวเลือกการกำหนดค่าเพื่อกำหนดไฟล์เทมเพลตของคุณเอง

ฉันยังแนะนำให้ทำความคุ้นเคยกับปลั๊กอินอย่างเป็นทางการของ Eleventy ที่เหลือ เนื่องจากพวกมันตอบสนองความต้องการทั่วไปอื่น ๆ รวมถึงการนำทางและการจัดการรูปภาพ

ตัดสินใจว่า Eleventy เหมาะสมกับโครงการของคุณหรือไม่

เช่นเดียวกับไซต์สแตติกส่วนใหญ่ ไซต์ 11 แห่งเหมาะที่สุดสำหรับเนื้อหาที่ไม่จำเป็นต้องแสดงแบบไดนามิกหรือแบบออนดีมานด์ตามปกติ นี่ไม่ได้หมายความว่าเว็บไซต์ ทั้งหมด จะต้องเป็นแบบคงที่ หรือไม่มีทางที่จะทำให้เนื้อหาเป็นไดนามิกได้ คุณยังคงสามารถโหลด JavaScript เพื่อเปิดใช้งานเนื้อหาแบบไดนามิก เช่น การดึงข้อมูลจาก API หรือการสร้างวิดเจ็ตแบบโต้ตอบ คุณยังสามารถใช้บริการต่างๆ เช่น IFTTT หรือ Zapier เพื่ออำนวยความสะดวกในการสร้างไซต์ของคุณใหม่ได้ หากโฮสต์ของคุณสนับสนุนการสร้างเว็บฮุค และคุณมีส่วนที่คุณต้องการรีเฟรชตามกำหนดเวลา

ต้องขอบคุณข้อมูลที่กำหนดเองและการแบ่งหน้า เราพบว่าการรวมข้อมูลภายนอกเป็นเรื่องง่าย เช่น จาก CMS ที่ไม่มีส่วนหัวหรือ API อื่นๆ ดังนั้นแม้ว่าจะให้บริการแบบคงที่ แต่คุณยังคงมีความยืดหยุ่นมากในการดึงเนื้อหาและวิธีจัดการ

สิ่งที่ฉันชอบเกี่ยวกับ Eleventy ก็คือ มันไม่ได้กำหนดความคิดเห็นมากมายเกี่ยวกับวิธีที่ฉันควรจัดโครงสร้างไซต์ของฉัน นอกเหนือจากไดเร็กทอรีที่เราพูดถึงสำหรับ _includes และ _data (และคุณสามารถอัปเดตรูปแบบการตั้งชื่อของไดเร็กทอรีเหล่านั้นได้ด้วย) นอกจากนี้ยังมีประโยชน์หากคุณต้องการย้ายไซต์และอาจย้ายโครงสร้างไฟล์ที่มีอยู่บางส่วนได้เช่นกัน อย่างไรก็ตาม หากคุณต้องการสถาปัตยกรรมที่มีความคิดเห็นมากกว่า คุณอาจจะมองหาทางเลือกอื่น

ฉันยังสนุกกับวิธีที่ฉันสามารถปั้น Eleventy ให้เข้ากับโมเดลจิตของฉันสำหรับโปรเจ็กต์ที่กำหนดโดยใช้ประโยชน์จากภาษาเทมเพลตหลายภาษา รวมถึงตัวกรอง รหัสย่อ และเลย์เอาต์ ผู้เริ่มต้นยังช่วยส่งเสริมเพื่อให้คุณสามารถจดจ่อกับสิ่งที่สำคัญจริงๆ นั่นคือเนื้อหาของคุณ และประสิทธิภาพสูงของเอาต์พุตแบบคงที่ล้วนก็เป็นประโยชน์อย่างยิ่งเช่นกัน

หากคุณต้องการกระบวนการสร้างเพิ่มอีกเล็กน้อย คุณสามารถเพิ่มเครื่องมืออื่นๆ ที่คุ้นเคย เช่น Webpack, Gulp หรือ Parcel คุณอาจสามารถหาสตาร์ทเตอร์ที่มีสิ่งเหล่านี้อยู่แล้ว โปรดทราบว่าคุณยังสามารถใช้ประโยชน์จากสคริปต์โหนดซึ่งมีอยู่ในกระบวนการบิลด์ Eleventy อยู่แล้ว

Eleventy มีความสามารถในการจัดการการสร้างเพจจำนวนมาก มันถูกใช้สำหรับไซต์ขนาดใหญ่และซับซ้อนเช่น web.dev ของ Google และไซต์การตลาดของ Netlify ฉันยังใช้ Eleventy เพื่อจุดประสงค์ที่แปลกใหม่ เช่น เครื่องมือสร้างอีเมลและส่วนประกอบเว็บ ร่วมกับสิ่งอื่นๆ ที่อธิบายไว้ในภาพรวมนี้

แหล่งข้อมูลเพิ่มเติม

ฉันหวังว่าคู่มือนี้จะดึงดูดความสนใจของคุณและเตรียมคุณให้พร้อมสำหรับการเริ่มต้นใช้งาน Eleventy! มันรวมประเด็นมากมายที่ฉันพบว่ายากที่จะค้นพบเมื่อฉันสร้างโครงการแรกของฉันด้วย ตั้งแต่ฉันพบ Eleventy ครั้งแรกในเดือนเมษายน 2020 ฉันได้สร้างโครงการ Eleventy ไปแล้วกว่า 20 โปรเจ็กต์ โดยนับการเริ่มต้น ปลั๊กอิน โปรเจ็กต์เสริม และเนื้อหาหลักสูตร สิ่งเหล่านี้สามารถพบได้บนเว็บไซต์ของฉัน 11ty.Rocks ซึ่งมีบทแนะนำและเคล็ดลับด้วย สิบเอ็ดสิบเป็นสิ่งที่ฉันสนุกกับการพูดคุยมาก ดังนั้นอย่าลังเลที่จะติดต่อบน Twitter!

ต่อไปนี้เป็นแหล่งข้อมูลเพิ่มเติมเพื่อช่วยคุณในการเดินทางเพื่อเรียนรู้และรับประโยชน์สูงสุดจาก Eleventy:

  • Andy Bell เสนอหลักสูตรแบบชำระเงินที่ครอบคลุมมาก - “เรียนรู้สิบเอ็ดสิบตั้งแต่เริ่มต้น”
  • ชุดบทช่วยสอนของ Tatiana Mac ที่เริ่มต้นด้วย “คู่มือสำหรับผู้เริ่มต้นใช้งานจนถึงอายุ Eleventy” ให้คำอธิบายอย่างละเอียดซึ่งถือว่าไม่มีประสบการณ์กับตัวสร้างไซต์แบบคงที่มาก่อน
  • Bryan Robinson เสนอหลักสูตร YouTube สำหรับการแปลงธีม HTML ฟรีเป็นไซต์ Eleventy

สุดท้ายนี้ ฉันต้องการทราบว่าชุมชน Eleventy มีขนาดเล็กแต่มีความกระตือรือร้น! หากคุณประสบปัญหาในการค้นหาข้อมูล คุณสามารถทวีตคำถามของคุณไปที่บัญชี @eleven_ty อย่างเป็นทางการ Zach Leatherman ผู้สร้างของ Eleventy ตอบคำถามอย่างรวดเร็วหรือ RT คำถามเพื่อช่วยให้คุณกลับมาเหมือนเดิม!