0Pricing
HTML Academy · บทเรียน

การสร้างเทมเพลตฝั่งเซิร์ฟเวอร์ 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>" จะให้ผลลัพธ์เป็น "&lt;script&gt;" ซึ่งช่วยทำให้ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การแยกองค์ประกอบและเทมเพลตย่อย
  2. การสร้างเทมเพลตฝั่งเซิร์ฟเวอร์ Jinja2 Handlebars
  3. HTML ในระบบการออกแบบ
  4. การผสานเอกสารและคู่มือรูปแบบ
← กลับไปที่ HTML Academy