DOM ขนาดใหญ่ส่งผลต่อการโต้ตอบมากกว่าที่คุณคิด คู่มือนี้จะอธิบายสาเหตุและสิ่งที่คุณสามารถทําได้
ไม่สามารถทำได้ กล่าวคือ เมื่อคุณสร้างหน้าเว็บ หน้านั้นจะต้องมี Document Object Model (DOM) DOM จะแสดงโครงสร้าง HTML ของหน้าเว็บ และให้ JavaScript และ CSS ในการเข้าถึงโครงสร้างและเนื้อหาของหน้าเว็บ
แต่ปัญหาคือ ขนาดของ DOM จะส่งผลต่อความสามารถของเบราว์เซอร์ในการแสดงผลหน้าเว็บอย่างรวดเร็วและมีประสิทธิภาพ โดยทั่วไปแล้ว ยิ่ง DOM มีขนาดใหญ่เท่าใด การเรนเดอร์หน้าเว็บนั้นในตอนแรกและอัปเดตการเรนเดอร์ในภายหลังในวงจรชีวิตของหน้าเว็บก็จะยิ่งสิ้นเปลืองอินเทอร์เน็ตมากขึ้นเท่านั้น
ปัญหานี้จะทำให้เกิดปัญหาในหน้าที่มี DOM ขนาดใหญ่มากเมื่อการโต้ตอบที่แก้ไขหรืออัปเดต DOM จะทริกเกอร์เลย์เอาต์ที่มีราคาแพงซึ่งส่งผลต่อความสามารถของหน้าเว็บในการตอบสนองอย่างรวดเร็ว การวางเลย์เอาต์ที่ใช้เวลานานอาจส่งผลต่อ Interaction to Next Paint (INP) ของหน้าเว็บ หากต้องการให้หน้าเว็บตอบสนองต่อการโต้ตอบของผู้ใช้อย่างรวดเร็ว คุณควรตรวจสอบว่า DOM มีขนาดใหญ่เพียงเท่าที่จำเป็นเท่านั้น
DOM ของหน้าเว็บจะใหญ่เกินไปเมื่อใด
ตาม Lighthouse ขนาด DOM ของหน้าเว็บจะถือว่ามากเกินไปเมื่อเกิน 1,400 โหนด Lighthouse จะเริ่มแสดงคำเตือนเมื่อ DOM ของหน้าเว็บมีโหนดมากกว่า 800 โหนด ใช้ HTML ต่อไปนี้เป็นตัวอย่าง
<ul>
<li>List item one.</li>
<li>List item two.</li>
<li>List item three.</li>
</ul>
ในโค้ดข้างต้นมีองค์ประกอบ DOM 4 อย่าง ได้แก่ องค์ประกอบ <ul>
และองค์ประกอบย่อย <li>
3 รายการ หน้าเว็บของคุณจะมีโหนดมากกว่านี้อีกหลายโหนด คุณจึงควรทำความเข้าใจสิ่งที่ทำได้เพื่อให้ขนาด DOM ตรวจสอบอยู่เสมอ รวมถึงกลยุทธ์อื่นๆ ในการเพิ่มประสิทธิภาพการแสดงผลเมื่อ DOM ของหน้าเว็บมีขนาดเล็กที่สุดเท่าที่จะเป็นไปได้
DOM ขนาดใหญ่ส่งผลต่อประสิทธิภาพของหน้าเว็บอย่างไร
DOM ขนาดใหญ่ส่งผลต่อประสิทธิภาพของหน้าใน 3 ลักษณะ ดังนี้
- ในระหว่างการแสดงผลเริ่มต้นของหน้า เมื่อใช้ CSS ในหน้าเว็บ ระบบจะสร้างโครงสร้างที่คล้ายกับ DOM ซึ่งเรียกว่า CSS Object Model (CSSOM) เมื่อตัวเลือก CSS มีความเฉพาะเจาะจงมากขึ้น CSSOM ก็จะซับซ้อนมากขึ้น และต้องใช้เวลามากขึ้นในการเรียกใช้เลย์เอาต์ การจัดสไตล์ การคอมโพสิต และการวาดที่จำเป็นในการวาดหน้าเว็บไปยังหน้าจอ งานที่เพิ่มเข้ามานี้จะเพิ่มเวลาในการตอบสนองของการโต้ตอบสำหรับการโต้ตอบที่เกิดขึ้นในช่วงแรกๆ ระหว่างการโหลดหน้าเว็บ
- เมื่อการโต้ตอบแก้ไข DOM ไม่ว่าจะผ่านการแทรกหรือลบองค์ประกอบ หรือแก้ไขเนื้อหาและสไตล์ DOM การทำงานที่จำเป็นในการแสดงผลอัปเดตนั้นอาจส่งผลให้มีค่าใช้จ่ายสูงมากสำหรับเลย์เอาต์ การจัดสไตล์ การคอมโพส และงานเพนต์ ในกรณีของการแสดงผลครั้งแรกของหน้าเว็บ ความจำเพาะของตัวเลือก CSS ที่เพิ่มขึ้นอาจเพิ่มไปยังการแสดงผลเมื่อมีการแทรกองค์ประกอบ HTML ลงใน DOM ซึ่งเป็นผลจากการโต้ตอบ
- เมื่อ JavaScript ค้นหาใน DOM ระบบจะจัดเก็บการอ้างอิงถึงองค์ประกอบ DOM ไว้ในหน่วยความจำ ตัวอย่างเช่น หากคุณเรียกใช้
document.querySelectorAll
เพื่อเลือกองค์ประกอบ<div>
ทั้งหมดในหน้าเว็บ ค่าใช้จ่ายด้านหน่วยความจำอาจเป็นไปได้สูงหากผลลัพธ์แสดงองค์ประกอบ DOM จำนวนมาก
ปัจจัยเหล่านี้ทั้งหมดอาจส่งผลต่อการโต้ตอบ แต่รายการที่ 2 ในรายการข้างต้นมีความสำคัญอย่างยิ่ง หากการโต้ตอบทําให้เกิดการเปลี่ยนแปลง DOM ก็อาจทําให้เกิดงานจำนวนมากซึ่งอาจทําให้ INP ในหน้าเว็บไม่ดี
ฉันจะวัดขนาด DOM ได้อย่างไร
คุณวัดขนาด DOM ได้ 2 วิธี วิธีแรกใช้ Lighthouse เมื่อคุณดำเนินการตรวจสอบ สถิติใน DOM ของหน้าเว็บปัจจุบันจะอยู่ในการตรวจสอบ "หลีกเลี่ยง DOM ที่มีขนาดใหญ่เกินไป" ภายใต้หัวข้อ "การวินิจฉัย" ในส่วนนี้ คุณจะเห็นจำนวนรวมขององค์ประกอบ DOM, องค์ประกอบ DOM ที่มีองค์ประกอบย่อยส่วนใหญ่ รวมถึงองค์ประกอบ DOM ที่ลึกที่สุด
วิธีง่ายกว่านั้นคือการใช้คอนโซล JavaScript ในเครื่องมือสําหรับนักพัฒนาซอฟต์แวร์ในเบราว์เซอร์หลักๆ หากต้องการดูจํานวนองค์ประกอบ HTML ทั้งหมดใน DOM ให้ใช้โค้ดต่อไปนี้ในคอนโซลหลังจากที่โหลดหน้าเว็บแล้ว
document.querySelectorAll('*').length;
หากต้องการดูการอัปเดตขนาด DOM แบบเรียลไทม์ คุณก็ใช้เครื่องมือตรวจสอบประสิทธิภาพได้เช่นกัน การใช้เครื่องมือนี้จะช่วยให้คุณเชื่อมโยงการดำเนินการเกี่ยวกับเลย์เอาต์และการจัดสไตล์ (และด้านประสิทธิภาพอื่นๆ) กับขนาด DOM ปัจจุบันได้
หากขนาด DOM ใกล้จะถึงเกณฑ์การเตือนขนาด DOM ของ Lighthouse หรือไม่ผ่านเลย ขั้นตอนถัดไปคือการหาวิธีลดขนาด DOM เพื่อปรับปรุงความสามารถของหน้าเว็บในการตอบสนองต่อการโต้ตอบของผู้ใช้เพื่อให้ INP ของเว็บไซต์ดีขึ้น
ฉันจะวัดจํานวนองค์ประกอบ DOM ที่ได้รับผลกระทบจากการโต้ตอบได้อย่างไร
หากคุณกําลังวิเคราะห์การโต้ตอบที่ช้าในแท็บทดลองซึ่งคุณสงสัยว่าอาจเกี่ยวข้องกับขนาด DOM ของหน้าเว็บ คุณสามารถดูจํานวนองค์ประกอบ DOM ที่ได้รับผลกระทบได้โดยเลือกกิจกรรมใดก็ได้ในเครื่องมือวิเคราะห์ที่มีป้ายกำกับ "คํานวณสไตล์อีกครั้ง" และดูข้อมูลตามบริบทในแผงด้านล่าง
ในภาพหน้าจอด้านบน โปรดสังเกตว่าการคำนวณสไตล์ของผลงานอีกครั้ง (เมื่อเลือก) จะแสดงจำนวนองค์ประกอบที่ได้รับผลกระทบ ในขณะที่ภาพหน้าจอด้านบนแสดงให้เห็นกรณีที่สุดโต่งของผลกระทบของขนาด DOM ที่มีต่อการแสดงผลในหน้าที่มีองค์ประกอบ DOM จำนวนมาก แต่ข้อมูลการวินิจฉัยนี้จะมีประโยชน์ในกรณีต่างๆ ในการพิจารณาว่าขนาดของ DOM เป็นปัจจัยจำกัดระยะเวลาที่ใช้ในการวาดเฟรมถัดไปเพื่อตอบสนองต่อการโต้ตอบหรือไม่
ฉันจะลดขนาด DOM ได้อย่างไร
นอกจากการตรวจสอบ HTML ของเว็บไซต์เพื่อหามาร์กอัปที่ไม่จำเป็นแล้ว วิธีหลักในการลดขนาด DOM คือการลดความลึกของ DOM สัญญาณหนึ่งที่บ่งบอกว่า DOM อาจมีความลึกเกินความจำเป็นคือเมื่อคุณเห็นมาร์กอัปที่มีลักษณะดังต่อไปนี้ในแท็บองค์ประกอบของเครื่องมือสําหรับนักพัฒนาซอฟต์แวร์ของเบราว์เซอร์
<div>
<div>
<div>
<div>
<!-- Contents -->
</div>
</div>
</div>
</div>
เมื่อเห็นรูปแบบเช่นนี้ คุณอาจลดความซับซ้อนได้โดยการปรับโครงสร้าง DOM ให้แบน การทำเช่นนั้นจะทำให้องค์ประกอบ DOM มีจำนวนลดลงและมีแนวโน้มที่จะทำให้คุณมีโอกาสลดความซับซ้อนของสไตล์หน้าเว็บ
ความลึกของ DOM อาจเป็นอาการของเฟรมเวิร์กที่คุณใช้ โดยเฉพาะอย่างยิ่งเฟรมเวิร์กแบบคอมโพเนนต์ เช่น เฟรมเวิร์กที่ใช้ JSX จะกำหนดให้คุณฝังคอมโพเนนต์หลายรายการไว้ในคอนเทนเนอร์หลัก
อย่างไรก็ตาม เฟรมเวิร์กจำนวนมากช่วยให้คุณหลีกเลี่ยงการซ้อนคอมโพเนนต์โดยใช้สิ่งที่เรียกว่าส่วนย่อยได้ เฟรมเวิร์กแบบคอมโพเนนต์ที่นำเสนอฟีเจอร์แบบข้อมูลโค้ด ได้แก่ (แต่ไม่จำกัดเพียง) รายการต่อไปนี้
การใช้ชิ้นส่วนในเฟรมเวิร์กที่คุณเลือกจะช่วยลดความลึกของ DOM ได้ หากคุณกังวลเกี่ยวกับผลกระทบจากการแยกโครงสร้าง DOM ที่มีต่อการจัดรูปแบบ คุณอาจได้ประโยชน์จากการใช้โหมดเลย์เอาต์ที่ทันสมัยกว่า (และเร็วกว่า) เช่น flexbox หรือ grid
กลยุทธ์อื่นๆ ที่ควรพิจารณา
แม้ว่าคุณจะพบปัญหาในการแยกโครงสร้าง DOM และนำองค์ประกอบ HTML ที่ไม่จำเป็นออกเพื่อให้ DOM มีขนาดเล็กที่สุด แต่ DOM ยังคงมีขนาดค่อนข้างใหญ่และเริ่มการแสดงผลได้เป็นจำนวนมากเมื่อมีการเปลี่ยนแปลงตามการโต้ตอบของผู้ใช้ หากพบว่าตัวเองอยู่ในสถานการณ์เช่นนี้ คุณอาจพิจารณาใช้กลยุทธ์อื่นๆ เพื่อจำกัดงานแสดงผลได้
ลองใช้แนวทางแบบเพิ่ม
คุณอาจอยู่ในตําแหน่งที่ผู้ใช้ไม่เห็นส่วนสําคัญของหน้าเว็บเมื่อหน้าเว็บแสดงผลครั้งแรก การทำเช่นนี้อาจเป็นโอกาสในการโหลด HTML แบบ Lazy Loading ด้วยการละเว้นส่วนเหล่านั้นของ DOM เมื่อเริ่มต้นใช้งาน แต่ให้เพิ่มเข้ามาเมื่อผู้ใช้มีการโต้ตอบกับส่วนต่างๆ ของหน้าที่ต้องใช้ด้านที่ซ่อนอยู่ของหน้าในตอนแรก
วิธีการนี้มีประโยชน์ทั้งในระหว่างการโหลดครั้งแรกและบางทีหลังจากนั้น สำหรับการโหลดหน้าเว็บเริ่มต้น คุณจะลดการแสดงผลงานแรกลง ซึ่งหมายความว่าเพย์โหลด HTML เริ่มต้นจะเบาลงและจะแสดงผลได้เร็วขึ้น วิธีนี้จะช่วยให้การโต้ตอบในช่วงสําคัญดังกล่าวมีโอกาสแสดงมากขึ้นโดยมีการแข่งขันน้อยลงสําหรับความสนใจของชุดข้อความหลัก
หากคุณมีหน้าเว็บหลายส่วนที่ซ่อนอยู่ตั้งแต่แรกเมื่อโหลด ก็อาจเร่งการโต้ตอบอื่นๆ ที่ทริกเกอร์การเรนเดอร์ใหม่ได้ อย่างไรก็ตาม เมื่อการโต้ตอบอื่นๆ เพิ่ม DOM มากขึ้น งานแสดงผลจะเพิ่มขึ้นเมื่อ DOM เติบโตตลอดอายุการใช้งานของหน้า
การเพิ่มลงใน DOM เมื่อเวลาผ่านไปอาจเป็นเรื่องยากและมีข้อเสียอยู่ หากใช้เส้นทางนี้ คุณน่าจะกำลังสร้างคำขอของเครือข่ายเพื่อดึงข้อมูลเพื่อเติม HTML ที่คุณตั้งใจจะเพิ่มลงในหน้าเว็บเพื่อตอบสนองต่อการโต้ตอบของผู้ใช้ แม้ว่าคำขอเครือข่ายระหว่างการส่งจะไม่นับรวมใน INP แต่อาจเพิ่มเวลาในการตอบสนองที่รับรู้ได้ หากเป็นไปได้ ให้แสดงภาพหมุนที่แสดงสถานะกำลังโหลดหรือตัวบ่งชี้อื่นๆ ที่ระบุว่าระบบกําลังดึงข้อมูลอยู่เพื่อให้ผู้ใช้ทราบว่ามีการดำเนินการบางอย่างเกิดขึ้น
จำกัดความซับซ้อนของตัวเลือก CSS
เมื่อเบราว์เซอร์แยกวิเคราะห์ตัวเลือกใน CSS เบราว์เซอร์จะต้องข้ามผ่านแผนผัง DOM เพื่อทำความเข้าใจวิธีการ และกรณีที่ตัวเลือกเหล่านั้นมีผลกับเลย์เอาต์ปัจจุบัน ยิ่งตัวเลือกเหล่านี้ซับซ้อนมากเท่าใด เบราว์เซอร์ก็ยิ่งต้องทำงานมากขึ้นเพื่อแสดงผลหน้าเว็บครั้งแรก รวมถึงต้องคํานวณสไตล์และเลย์เอาต์ใหม่มากขึ้นหากหน้าเว็บมีการเปลี่ยนแปลงอันเป็นผลมาจากการโต้ตอบ
ใช้พร็อพเพอร์ตี้ content-visibility
CSS มีพร็อพเพอร์ตี้ content-visibility
ซึ่งเป็นวิธีที่มีประสิทธิภาพในการแสดงผลองค์ประกอบ DOM นอกหน้าจอแบบ Lazy เมื่อองค์ประกอบเข้าใกล้วิวพอร์ต ระบบจะแสดงผลตามคําขอ ประโยชน์ของ content-visibility
ไม่ได้แค่ลดงานการแสดงผลจำนวนมากในการแสดงผลหน้าเว็บครั้งแรก แต่ยังข้ามงานการแสดงผลสำหรับองค์ประกอบที่อยู่นอกหน้าจอด้วยเมื่อ DOM ของหน้าเว็บมีการเปลี่ยนแปลงอันเป็นผลมาจากการโต้ตอบของผู้ใช้
บทสรุป
การลดขนาด DOM ให้มีเฉพาะสิ่งที่จําเป็นเท่านั้นเป็นวิธีที่ดีในการเพิ่มประสิทธิภาพ INP ของเว็บไซต์ ซึ่งจะช่วยลดความเวลาที่เบราว์เซอร์ใช้ในการจัดวางและแสดงผลเมื่อ DOM ได้รับการอัปเดต แม้ว่าคุณจะลดขนาด DOM ไม่ได้ แต่ก็มีเทคนิคบางอย่างที่คุณสามารถใช้แยกงานแสดงผลไปยัง DOM ย่อยได้ เช่น การจำกัด CSS และพร็อพเพอร์ตี้ content-visibility
CSS
ไม่ว่าคุณจะดำเนินการอย่างไร การสร้างสภาพแวดล้อมที่ลดการทำงานของการแสดงผลให้เหลือน้อยที่สุด รวมถึงลดปริมาณการทำงานของการแสดงผลที่หน้าเว็บทำเพื่อตอบสนองต่อการโต้ตอบ จะทำให้เว็บไซต์ตอบสนองต่อผู้ใช้ได้ดีขึ้นเมื่อผู้ใช้โต้ตอบกับเว็บไซต์ ซึ่งหมายความว่าเว็บไซต์จะมี INP ลดลง ซึ่งส่งผลให้ผู้ใช้ได้รับประสบการณ์การใช้งานที่ดีขึ้น