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

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 ลักษณะ ดังนี้

  1. ในระหว่างการแสดงผลเริ่มต้นของหน้า เมื่อใช้ CSS ในหน้าเว็บ ระบบจะสร้างโครงสร้างที่คล้ายกับ DOM ซึ่งเรียกว่า CSS Object Model (CSSOM) เมื่อตัวเลือก CSS มีความเฉพาะเจาะจงมากขึ้น CSSOM ก็จะซับซ้อนมากขึ้น และต้องใช้เวลามากขึ้นในการเรียกใช้เลย์เอาต์ การจัดสไตล์ การคอมโพสิต และการวาดที่จำเป็นในการวาดหน้าเว็บไปยังหน้าจอ งานที่เพิ่มเข้ามานี้จะเพิ่มเวลาในการตอบสนองของการโต้ตอบสำหรับการโต้ตอบที่เกิดขึ้นในช่วงแรกๆ ระหว่างการโหลดหน้าเว็บ
  2. เมื่อการโต้ตอบแก้ไข DOM ไม่ว่าจะผ่านการแทรกหรือลบองค์ประกอบ หรือแก้ไขเนื้อหาและสไตล์ DOM การทำงานที่จำเป็นในการแสดงผลอัปเดตนั้นอาจส่งผลให้มีค่าใช้จ่ายสูงมากสำหรับเลย์เอาต์ การจัดสไตล์ การคอมโพส และงานเพนต์ ในกรณีของการแสดงผลครั้งแรกของหน้าเว็บ ความจำเพาะของตัวเลือก CSS ที่เพิ่มขึ้นอาจเพิ่มไปยังการแสดงผลเมื่อมีการแทรกองค์ประกอบ HTML ลงใน DOM ซึ่งเป็นผลจากการโต้ตอบ
  3. เมื่อ JavaScript ค้นหาใน DOM ระบบจะจัดเก็บการอ้างอิงถึงองค์ประกอบ DOM ไว้ในหน่วยความจำ ตัวอย่างเช่น หากคุณเรียกใช้ document.querySelectorAll เพื่อเลือกองค์ประกอบ <div> ทั้งหมดในหน้าเว็บ ค่าใช้จ่ายด้านหน่วยความจำอาจเป็นไปได้สูงหากผลลัพธ์แสดงองค์ประกอบ DOM จำนวนมาก
ภาพหน้าจอของงานที่ใช้เวลานานซึ่งเกิดจากงานแสดงผลที่มากเกินไปในแผงประสิทธิภาพของเครื่องมือสำหรับนักพัฒนาเว็บใน Chrome Call Stack ของงานที่ใช้เวลานานแสดงเวลาที่ต้องใช้ในการคำนวณรูปแบบหน้าเว็บใหม่ รวมถึงการระบายสีล่วงหน้า
งานที่ใช้เวลานานตามที่แสดงในเครื่องมือวิเคราะห์ประสิทธิภาพในเครื่องมือสำหรับนักพัฒนาเว็บใน Chrome งานที่ใช้เวลานานที่แสดงเกิดจากการแทรกองค์ประกอบ DOM ลงใน DOM ขนาดใหญ่ผ่าน JavaScript

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

ฉันจะวัดขนาด DOM ได้อย่างไร

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

วิธีง่ายกว่านั้นคือการใช้คอนโซล JavaScript ในเครื่องมือสําหรับนักพัฒนาซอฟต์แวร์ในเบราว์เซอร์หลักๆ หากต้องการดูจํานวนองค์ประกอบ HTML ทั้งหมดใน DOM ให้ใช้โค้ดต่อไปนี้ในคอนโซลหลังจากที่โหลดหน้าเว็บแล้ว

document.querySelectorAll('*').length;

หากต้องการดูการอัปเดตขนาด DOM แบบเรียลไทม์ คุณก็ใช้เครื่องมือตรวจสอบประสิทธิภาพได้เช่นกัน การใช้เครื่องมือนี้จะช่วยให้คุณเชื่อมโยงการดำเนินการเกี่ยวกับเลย์เอาต์และการจัดสไตล์ (และด้านประสิทธิภาพอื่นๆ) กับขนาด DOM ปัจจุบันได้

ภาพหน้าจอของการตรวจสอบประสิทธิภาพใน Chrome DevTools ทางด้านซ้ายมีแง่มุมต่างๆ ของประสิทธิภาพหน้าเว็บที่สามารถตรวจสอบได้อย่างต่อเนื่องตลอดอายุของหน้าเว็บ ในภาพหน้าจอ ระบบกำลังตรวจสอบจำนวนโหนด DOM, เลย์เอาต์ต่อวินาที และการคํานวณสไตล์ใหม่ต่อส่วน
เครื่องมือตรวจสอบประสิทธิภาพในเครื่องมือสำหรับนักพัฒนาเว็บใน Chrome ในมุมมองนี้ ระบบจะแสดงจำนวนโหนด DOM ในปัจจุบันของหน้าเว็บเป็นแผนภูมิ พร้อมกับการดำเนินการกับเลย์เอาต์และการคํานวณสไตล์ใหม่ต่อวินาที

หากขนาด DOM ใกล้จะถึงเกณฑ์การเตือนขนาด DOM ของ Lighthouse หรือไม่ผ่านเลย ขั้นตอนถัดไปคือการหาวิธีลดขนาด DOM เพื่อปรับปรุงความสามารถของหน้าเว็บในการตอบสนองต่อการโต้ตอบของผู้ใช้เพื่อให้ INP ของเว็บไซต์ดีขึ้น

ฉันจะวัดจํานวนองค์ประกอบ DOM ที่ได้รับผลกระทบจากการโต้ตอบได้อย่างไร

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

ภาพหน้าจอของกิจกรรมการคํานวณสไตล์ที่เลือกใหม่ในแผงประสิทธิภาพของเครื่องมือสําหรับนักพัฒนาเว็บใน Chrome ที่ด้านบน แทร็กการโต้ตอบจะแสดงการโต้ตอบด้วยการคลิก และงานส่วนใหญ่ใช้เวลาในการคํานวณสไตล์ใหม่และงานก่อนการวาด แผงจะแสดงรายละเอียดเพิ่มเติมของกิจกรรมที่เลือกที่ด้านล่าง ซึ่งรายงานว่าได้รับผลกระทบจากองค์ประกอบ DOM จำนวน 2,547 รายการ
สังเกตจำนวนองค์ประกอบที่ได้รับผลกระทบใน DOM ซึ่งเป็นผลมาจากการคำนวณสไตล์ใหม่ โปรดทราบว่าส่วนที่แรเงาของการโต้ตอบในแทร็กการโต้ตอบแสดงถึงส่วนของระยะเวลาการโต้ตอบที่นานกว่า 200 มิลลิวินาที ซึ่งเป็นเกณฑ์ "ดี" ที่กําหนดไว้สําหรับ INP

ในภาพหน้าจอด้านบน โปรดสังเกตว่าการคำนวณสไตล์ของผลงานอีกครั้ง (เมื่อเลือก) จะแสดงจำนวนองค์ประกอบที่ได้รับผลกระทบ ในขณะที่ภาพหน้าจอด้านบนแสดงให้เห็นกรณีที่สุดโต่งของผลกระทบของขนาด 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 ลดลง ซึ่งส่งผลให้ผู้ใช้ได้รับประสบการณ์การใช้งานที่ดีขึ้น