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 ขนาดใหญ่ส่งผลต่อประสิทธิภาพของหน้าเว็บในหลายลักษณะ ดังนี้

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