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

Shadow DOM แบบประกาศ

แนบ Shadow DOM จาก HTML โดยไม่ใช้ JavaScript ด้วย shadowrootmode

Shadow DOM แบบประกาศ เป็นบทเรียน HTML Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน HTML Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส HTML Academy มีบทเรียนทั้งหมด 4 บทเรียน

ปัญหาที่แก้ไขได้

DOM เงาแบบดั้งเดิมสร้างขึ้นผ่าน JavaScript (attachShadow) สำหรับหน้าเว็บที่แสดงผลจากเซิร์ฟเวอร์ นั่นหมายความว่าต้นไม้เงาจะว่างเปล่าจนกว่า JS จะทำงาน ซึ่งขัดกับจุดประสงค์ของ SSR ที่ต้องส่ง HTML ครบถ้วนตั้งแต่ไบต์แรก DOM เงาแบบประกาศช่วยแก้ปัญหานี้

แอตทริบิวต์ shadowrootmode

<template> ที่มี shadowrootmode="open" จะประกาศรากเงาใน HTML ขณะประมวลผล เบราว์เซอร์จะแนบรากเงาเข้ากับองค์ประกอบแม่โดยอัตโนมัติ และเนื้อหาของเทมเพลตจะกลายเป็นต้นไม้เงา ไม่จำเป็นต้องใช้ JavaScript

<my-card>
  <template shadowrootmode="open">
    <style>:host { display: block; padding: 16px; }</style>
    <slot></slot>
  </template>
  <p>This goes into the slot</p>
</my-card>

SSR กับคอมโพเนนต์เว็บ

DOM เงาแบบประกาศช่วยให้คอมโพเนนต์เว็บแสดงผลจากเซิร์ฟเวอร์ได้อย่างแท้จริง: เซิร์ฟเวอร์ส่งต้นไม้เงาครบถ้วนไว้ใน HTML โดยตรง เบราว์เซอร์วิเคราะห์และแนบต้นไม้ดังกล่าวก่อนที่ JS ใด ๆ จะทำงาน และ JavaScript สำหรับไฮเดรตสามารถทำงานต่อจากพื้นฐานที่แสดงผลครบถ้วนแล้วได้ จึงทัดเทียมกับ SSR ของเฟรมเวิร์ก

โหมด: open หรือ closed

มีโหมดเดียวกับ attachShadow แบบ命令: shadowrootmode="open" จะเปิดเผยเงาผ่าน element.shadowRoot ส่วน shadowrootmode="closed" จะซ่อนเงาไว้ พฤติกรรมเหมือนกับส่วนที่แนบด้วย JavaScript ทุกประการ

วิเคราะห์ครั้งเดียวต่อองค์ประกอบ

เบราว์เซอร์จะแนบรากเงาเมื่อพบ <template shadowrootmode> เป็นครั้งแรก หลังจากแนบแล้ว เทมเพลตจะถูกใช้ไป การค้นหาเทมเพลตนี้ในภายหลังจึงไม่พบสิ่งใด ซึ่งสอดคล้องกับวงจรชีวิตของ attachShadow: เงาจะคงอยู่ตลอดอายุขององค์ประกอบ

สล็อตทำงานตามปกติ

องค์ประกอบลูกใน DOM ปกติ เช่น <p> ที่อยู่นอก <template> ในตัวอย่าง จะถูกส่งเข้าไปแสดงผ่านองค์ประกอบ <slot> ภายในต้นไม้เงาเช่นเดียวกับ DOM เงาแบบ命令 แนวทางการประกอบองค์ประกอบเหมือนเดิม ต่างกันเพียงกลไกการแนบเท่านั้น

การใช้ร่วมกับองค์ประกอบกำหนดเอง

หาก <my-card> เป็นองค์ประกอบกำหนดเองที่ลงทะเบียนไว้ กระบวนการอัปเกรดจะใช้รากเงาที่แนบอยู่แล้วแทนการเรียก attachShadow อีกครั้ง คลาสขององค์ประกอบกำหนดเองสามารถอ่าน this.shadowRoot ได้ใน connectedCallback โดยไม่ต้องสร้างรากเงาขึ้นมาเอง

การรองรับจากเครื่องมือฝั่งเซิร์ฟเวอร์

Lit-html render คอมโพเนนต์ของ Astro และเฟรมเวิร์กอื่น ๆ อีกหลายตัวสามารถส่งออก DOM เงาแบบประกาศเป็นส่วนหนึ่งของผลลัพธ์ SSR ได้แล้ว การสร้างระบบเองก็ทำได้เช่นกัน เพราะระบบสร้างแม่แบบจากสตริงทุกชนิดสามารถเขียนเทมเพลตที่มี shadowrootmode ได้

การรองรับจากเบราว์เซอร์

DOM เงาแบบประกาศมีให้ใช้งานใน Chrome, Edge, Safari และ Firefox เบราว์เซอร์รุ่นเก่าจะเพิกเฉยต่อองค์ประกอบ <template> อย่างเงียบ ๆ เนื้อหาภายในเทมเพลตจึงไม่ปรากฏ ซึ่งเป็นการลดความสามารถอย่างเหมาะสมสำหรับสภาพแวดล้อมที่ไม่รองรับ

แนวทางการใช้โพลีฟิลล์

หากต้องการรองรับได้กว้างขึ้น สคริปต์ขนาดเล็กสามารถเดินสำรวจ DOM และแปลง template[shadowrootmode] ให้เป็นรากเงาจริงได้ ให้เรียกใช้ก่อนลงทะเบียนองค์ประกอบกำหนดเองใด ๆ เพื่อให้การอัปเกรดองค์ประกอบในภายหลังมองเห็นต้นไม้เงาที่คาดไว้

ข้อแลกเปลี่ยน

DOM เงาแบบประกาศทำให้โครงสร้างซ้ำกัน: เนื้อหาของ <template> อยู่ใน HTML แม้ว่าโครงสร้างเดียวกันจะถูกฝังอยู่ในคลาสของคอมโพเนนต์ด้วย สำหรับหน้าที่มีองค์ประกอบเดียวกันจำนวนมาก สิ่งนี้ทำให้ข้อมูลที่ส่งไปมีขนาดใหญ่ขึ้น เฟรมเวิร์กจะกำจัดข้อมูลซ้ำให้ ส่วนการแสดงผลจากเซิร์ฟเวอร์ที่สร้างเองอาจต้องทำเช่นเดียวกัน

เมื่อใดควรนำมาใช้

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

ตรวจสอบความรู้

DOM เงาแบบประกาศแก้ปัญหาใดเมื่อเทียบกับ attachShadow แบบ命令

สรุป

DOM เงาแบบประกาศใช้ <template shadowrootmode="open"> ภายในองค์ประกอบกำหนดเองเพื่อแนบรากเงาขณะประมวลผล โดยไม่ต้องใช้ JS ช่วยให้คอมโพเนนต์เว็บรองรับ SSR ได้อย่างแท้จริง: ต้นไม้เงา รูปแบบที่มีขอบเขต และสล็อตทำงานได้ก่อนการไฮเดรต รองรับในเบราว์เซอร์สมัยใหม่ทั้งหมด และมีโพลีฟิลล์สำหรับเบราว์เซอร์รุ่นเก่า เฟรมเวิร์กอย่าง Lit และ Astro สามารถส่งออกความสามารถนี้โดยอัตโนมัติ

คำถามที่พบบ่อย

บทเรียน “Shadow DOM แบบประกาศ” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “Shadow DOM แบบประกาศ” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส HTML Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส HTML Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “Shadow DOM แบบประกาศ”

แนบ Shadow DOM จาก HTML โดยไม่ใช้ JavaScript ด้วย shadowrootmode คุณปฏิบัติ HTML Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน HTML Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน HTML Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน

บทเรียน “Shadow DOM แบบประกาศ” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน HTML Academy นี้ได้ไหม

ได้ บทเรียน HTML Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. Shadow DOM แบบประกาศ
  2. Popover API
  3. องค์ประกอบ selectlist
  4. ตัวเรียกใช้ความสนใจและแอตทริบิวต์ command
← กลับไปที่ HTML Academy