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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- Shadow DOM แบบประกาศ
- Popover API
- องค์ประกอบ selectlist
- ตัวเรียกใช้ความสนใจและแอตทริบิวต์ command