การสร้างเทมเพลตฝั่งเซิร์ฟเวอร์ Jinja2 Handlebars
ใช้เครื่องมือสร้างเทมเพลตเพื่อแสดงผล HTML แบบไดนามิกบนเซิร์ฟเวอร์
การสร้างเทมเพลตฝั่งเซิร์ฟเวอร์ Jinja2 Handlebars เป็นบทเรียน HTML Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน HTML Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส HTML Academy มีบทเรียนทั้งหมด 4 บทเรียน
เหตุใดจึงใช้เทมเพลตฝั่งเซิร์ฟเวอร์
เทมเพลตฝั่งเซิร์ฟเวอร์จะสร้าง HTML บนเซิร์ฟเวอร์ก่อนส่งไปยังเบราว์เซอร์ ทำให้ได้มาร์กอัปที่เป็นมิตรต่อ SEO ตั้งแต่ไบต์แรก ทำงานได้โดยไม่ใช้ JavaScript และหลีกเลี่ยงปัญหา "หน้าว่างจนกว่า JS จะโหลด" ของการแสดงผลฝั่งไคลเอนต์ล้วน
Jinja2 (Python)
Jinja2 คือไลบรารีเทมเพลต Python ที่ได้รับความนิยมเป็นมาตรฐานโดยพฤตินัย — ใช้โดย Flask, Django (ผ่านแบ็กเอนด์ที่มีให้หรือ jinja2), Pelican และ mkdocs ตรรกะอยู่ในแท็ก {% %} ส่วนนิพจน์อยู่ใน {{ }}: <h1>{{ title }}</h1> ใช้สำหรับตัวแปร และ {% for item in items %} ใช้สำหรับการวนซ้ำ
<ul>
{% for item in items %}
<li>{{ item.name }} — ${{ item.price }}</li>
{% endfor %}
</ul>Handlebars (JavaScript)
Handlebars คือไลบรารีเทมเพลต Node.js ที่มีผู้ใช้มากที่สุด นิยมใช้กับอีเมลธุรกรรม (SendGrid, Mailgun) และ SSR ผ่าน Express นิพจน์อยู่ใน {{ }} ส่วนบล็อกใช้ {{# }}: {{#each items}}<li>{{name}}</li>{{/each}}
<ul>
{{#each items}}
<li>{{name}} — ${{price}}</li>
{{/each}}
</ul>การหลีกอักขระอัตโนมัติ
เอนจินทั้งสองจะหลีกอักขระผลลัพธ์ของตัวแปรโดยอัตโนมัติเป็นค่าเริ่มต้น — {{ user.name }} เมื่อ name = "<script>" จะให้ผลลัพธ์เป็น "<script>" ซึ่งช่วยทำให้ XSS ไม่สามารถทำงานได้ โปรดอาศัยการหลีกอักขระอัตโนมัติเสมอ ใช้ตัวกรองดิบโดยระบุอย่างชัดเจน (Jinja: {{ x|safe }}, Handlebars: {{{x}}}) เฉพาะกับ HTML ที่เชื่อถือได้เท่านั้น
การสืบทอดเทมเพลต
Jinja: {% extends "base.html" %} ในเทมเพลตลูก และ {% block content %}{% endblock %} ในเทมเพลตฐาน Handlebars: {{#> layout }}{{/layout}} พร้อมบล็อกส่วนย่อย ช่วยให้เลย์เอาต์ฐานกำหนดโครงสร้างไว้เพียงครั้งเดียว แล้วแต่ละหน้าจึงเติมส่วนที่เปลี่ยนแปลงได้
การแทรกและส่วนย่อย
Jinja: {% include "header.html" %} Handlebars: {{> header}} ทั้งสองแบบจะแทรกเทมเพลตอีกชุดลงในเทมเพลตปัจจุบัน ส่วนย่อยเป็นองค์ประกอบพื้นฐานสำหรับคลังส่วนประกอบขนาดใหญ่ โดยนำมาประกอบกันเป็นหน้าและเลย์เอาต์
ฟิลเตอร์และตัวช่วย
ฟิลเตอร์ของ Jinja: {{ price|currency }} ตัวช่วยของ Handlebars: {{currency price}} ทั้งสองแบบช่วยให้คุณเรียกใช้ฟังก์ชันจัดรูปแบบกับค่าได้ คุณสามารถกำหนดฟังก์ชันของตนเองสำหรับการแปลงข้อมูลเฉพาะโครงการ เช่น การจัดรูปแบบวันที่ การทำให้เป็นพหูพจน์ และการสร้างลิงก์
เงื่อนไข
Jinja: {% if user.is_logged_in %}Welcome{% else %}Sign in{% endif %} Handlebars: {{#if user.isLoggedIn}}Welcome{{else}}Sign in{{/if}} แยกเส้นทางของเทมเพลตตามข้อมูลได้โดยไม่ต้องพึ่ง JS ฝั่งไคลเอ็นต์เพื่อซ่อนหรือแสดงเนื้อหา
ประสิทธิภาพ
เอนจินทั้งสองจะแปลเทมเพลตล่วงหน้าเป็นฟังก์ชัน แล้วเรียกใช้ฟังก์ชันเหล่านั้นในแต่ละคำขอ การแปลเกิดขึ้นเพียงครั้งเดียว ส่วนการเรนเดอร์ทำได้อย่างรวดเร็ว สำหรับเว็บไซต์ที่มีปริมาณการเข้าชมสูงมาก ให้แคชผลลัพธ์ที่เรนเดอร์แล้วไว้ที่เอดจ์ (Varnish, Cloudflare) แทนการเรนเดอร์หน้าที่เหมือนเดิมซ้ำ
การรองรับหลายภาษา
ใช้เทมเพลตร่วมกับไลบรารีสำหรับการรองรับหลายภาษา: Jinja2 + Babel สำหรับ Python และ Handlebars + i18next สำหรับ Node เทมเพลตจะเก็บคีย์การแปล ({{ t "welcome" }}) จากนั้นชั้นการรองรับหลายภาษาจะค้นหาข้อความในภาษาที่ถูกต้อง ทำให้เทมเพลตเดียวแสดงผลได้หลายภาษา
เทมเพลตของเฟรมเวิร์ก
เฟรมเวิร์กสมัยใหม่นำรูปแบบเทมเพลตของตนเองมาให้ เช่น ERB (Rails), Twig (Symfony), Blade (Laravel), Razor (.NET) และ Slim/Haml (ซึ่งกระชับกว่า) แนวคิดเหมือนกัน แต่ไวยากรณ์แตกต่างกัน โปรดเลือกเอนจินที่เข้ากับภาษาฝั่งเซิร์ฟเวอร์และระบบนิเวศของคุณ
การเปลี่ยนผ่านสู่คอมโพเนนต์
เทมเพลตเหมาะอย่างยิ่งกับเว็บไซต์แบบดั้งเดิมที่เรนเดอร์บนเซิร์ฟเวอร์ สำหรับแอปที่มีการโต้ตอบมากขึ้น เฟรมเวิร์กอย่าง Next.js (React), Nuxt (Vue) และ SvelteKit ทำให้เส้นแบ่งไม่ชัดเจน เพราะสามารถเรนเดอร์เทมเพลตบนเซิร์ฟเวอร์ได้ ขณะเดียวกันคอมโพเนนต์เดิมก็เริ่มทำงานบนไคลเอ็นต์เพื่อรองรับการโต้ตอบ
ตรวจสอบความรู้
เหตุใดการหลีกอักขระอัตโนมัติจึงเป็นพฤติกรรมเริ่มต้นของเอนจินเทมเพลตอย่าง Jinja2 และ Handlebars
สรุป
เอนจินเทมเพลตฝั่งเซิร์ฟเวอร์ (Jinja2 สำหรับ Python, Handlebars สำหรับ JS และ ERB/Twig/Blade สำหรับชุดเทคโนโลยีอื่น) จะสร้าง HTML บนเซิร์ฟเวอร์โดยใช้ตัวแปร ลูป เงื่อนไข ส่วนย่อย และการสืบทอด การหลีกอักขระอัตโนมัติช่วยป้องกัน XSS เป็นค่าเริ่มต้น ควรใช้ร่วมกับไลบรารีสำหรับการรองรับหลายภาษาเมื่อสร้างเว็บไซต์หลายภาษา เทมเพลตเป็นรากฐาน ส่วนเฟรมเวิร์กสมัยใหม่จะเพิ่มการทำงานบนไคลเอ็นต์หลังการเรนเดอร์
คำถามที่พบบ่อย
บทเรียน “การสร้างเทมเพลตฝั่งเซิร์ฟเวอร์ Jinja2 Handlebars” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การสร้างเทมเพลตฝั่งเซิร์ฟเวอร์ Jinja2 Handlebars” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส HTML Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส HTML Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การสร้างเทมเพลตฝั่งเซิร์ฟเวอร์ Jinja2 Handlebars”
ใช้เครื่องมือสร้างเทมเพลตเพื่อแสดงผล HTML แบบไดนามิกบนเซิร์ฟเวอร์ คุณปฏิบัติ HTML Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน HTML Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน HTML Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “การสร้างเทมเพลตฝั่งเซิร์ฟเวอร์ Jinja2 Handlebars” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน HTML Academy นี้ได้ไหม
ได้ บทเรียน HTML Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การแยกองค์ประกอบและเทมเพลตย่อย
- การสร้างเทมเพลตฝั่งเซิร์ฟเวอร์ Jinja2 Handlebars
- HTML ในระบบการออกแบบ
- การผสานเอกสารและคู่มือรูปแบบ