หลีกเลี่ยง DOM ที่มีขนาดใหญ่เกินไป

แผนผัง DOM ขนาดใหญ่สามารถทำให้ประสิทธิภาพหน้าเว็บช้าลงได้หลายทางดังนี้

  • ประสิทธิภาพของเครือข่ายและประสิทธิภาพการโหลด

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

  • ประสิทธิภาพรันไทม์

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

  • ประสิทธิภาพหน่วยความจำ

    หาก JavaScript ใช้ตัวเลือกคำค้นหาทั่วไป เช่น document.querySelectorAll('li') คุณอาจจัดเก็บการอ้างอิงไปยังโหนดจำนวนมากโดยไม่รู้ตัว ซึ่งอาจส่งผลให้ความสามารถของหน่วยความจําของอุปกรณ์ของผู้ใช้ทำงานหนักเกินไป

วิธีที่การตรวจสอบขนาด Lighthouse DOM ล้มเหลว

Lighthouse รายงานองค์ประกอบ DOM ทั้งหมดของหน้าเว็บ ความลึกของ DOM สูงสุดของหน้าเว็บ และองค์ประกอบย่อยสูงสุดดังต่อไปนี้

หลีกเลี่ยงการตรวจสอบ Ligthhouse ขนาดใหญ่ของ DOM ที่แสดงองค์ประกอบ DOM ทั้งหมด ความลึกของ DOM สูงสุด และองค์ประกอบย่อยสูงสุด
Lighthouse ไฮไลต์รายละเอียดขนาด DOM ที่มากเกินไป

Lighthouse แจ้งหน้าเว็บด้วยต้นไม้ DOM ซึ่งมีลักษณะดังนี้

  • เตือนเมื่อองค์ประกอบเนื้อหามีมากกว่า ~800 โหนด
  • ข้อผิดพลาดเมื่อองค์ประกอบเนื้อหามีมากกว่า ~1,400 โหนด

วิธีเพิ่มประสิทธิภาพขนาด DOM

โดยทั่วไป ให้มองหาวิธีสร้างโหนด DOM เฉพาะเมื่อจำเป็นเท่านั้น และทำลายโหนดเมื่อไม่จำเป็นต้องใช้แล้ว

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

หากคุณสร้างโหนด DOM ขณะรันไทม์ เบรกพอยท์การเปลี่ยนแปลง DOM ของ Subtree Modification จะช่วยให้คุณระบุเวลาที่สร้างโหนดได้

หากคุณหลีกเลี่ยงต้นไม้ DOM ขนาดใหญ่ไม่ได้ อีกแนวทางหนึ่งในการปรับปรุงประสิทธิภาพการแสดงผลคือการลดความซับซ้อนของตัวเลือก CSS ดูข้อมูลเพิ่มเติมได้ที่ลดขอบเขตและความซับซ้อนของการคำนวณรูปแบบของ Google

โปรดดูรายละเอียดเพิ่มเติมในบทความขนาดของ DOM ขนาดใหญ่ส่งผลต่อการโต้ตอบและสิ่งที่คุณทำได้

คำแนะนำเฉพาะสแต็ก

Angular

หากแสดงผลรายการจำนวนมาก ให้ใช้การเลื่อนเสมือนจริงด้วย Component Dev Kit (CDK)

โต้ตอบ

  • ใช้ไลบรารี "การสร้างกรอบเวลา" เช่น react-window เพื่อลดจำนวนโหนด DOM ที่สร้างขึ้นหากคุณแสดงผลองค์ประกอบที่ซ้ำกันหลายรายการในหน้านั้น
  • ลดการแสดงผลอีกครั้งที่ไม่จำเป็นโดยใช้ shouldComponentUpdate, PureComponent หรือ React.memo
  • ข้ามเอฟเฟกต์จนกว่าทรัพยากร Dependency บางอย่างจะเปลี่ยนแปลงไปหากคุณใช้ฮุก Effect เพื่อปรับปรุงประสิทธิภาพรันไทม์เท่านั้น

แหล่งข้อมูล