0Pricing
React Academy · บทเรียน

ปัญหาการเรนเดอร์รายการขนาดใหญ่

ทำความเข้าใจว่าเหตุใดการเรนเดอร์โหนด DOM จำนวน 10,000 โหนดจึงทำให้ประสิทธิภาพตกลงอย่างมาก และเวอร์ชวลไลเซชันช่วยแก้ปัญหาได้อย่างไร

ปัญหาการเรนเดอร์รายการขนาดใหญ่ เป็นบทเรียน React Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน React Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส React Academy มีบทเรียนทั้งหมด 4 บทเรียน

การเรนเดอร์องค์ประกอบ li จำนวน 10,000 รายการ

สมมติว่าคุณวนผ่านอาร์เรย์ที่มีรายการ 10,000 รายการ แล้วเรนเดอร์ li สำหรับแต่ละรายการ React จะสร้างโหนด DOM ครบทั้ง 10,000 โหนด แม้ว่าบนหน้าจอจะรองรับได้พร้อมกันเพียงประมาณสองสามโหลรายการ

โหนดส่วนใหญ่จะอยู่นอกหน้าจอและมองไม่เห็น แต่เบราว์เซอร์ก็ยังต้องสร้าง จัดวาง และดูแลโหนดทุกโหนด

ต้นทุนการจัดวางของเบราว์เซอร์สำหรับโครงสร้าง DOM ขนาดใหญ่

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

แม้แต่การโต้ตอบง่าย ๆ ก็อาจกระตุกได้เมื่อเอ็นจินต้องติดตามและจัดวางใหม่หลายหมื่นโหนด

ประสิทธิภาพการเลื่อนที่ลดลง

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

ผลลัพธ์คือการเลื่อนที่กระตุกและหน่วง ทำให้อินเทอร์เฟซดูเหมือนไม่ตอบสนอง ไม่ว่าแอปส่วนที่เหลือจะทำงานเร็วเพียงใด

การวัดจำนวนโหนดใน DevTools

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

การดูจำนวนดังกล่าวเพิ่มขึ้นอย่างรวดเร็วเมื่อคุณเรนเดอร์รายการมากขึ้น จะให้หลักฐานที่ชัดเจนว่าขนาด DOM เป็นคอขวด

แนวคิดการทำเวอร์ชวลไลเซชัน

เวอร์ชวลไลเซชันหรือที่เรียกว่าการทำหน้าต่างเสมือน จะเรนเดอร์เฉพาะรายการที่มองเห็นอยู่ในขณะนั้น รวมถึงพื้นที่สำรองขนาดเล็ก แทนการเรนเดอร์ทั้งรายการ เมื่อคุณเลื่อน รายการที่เข้ามาในมุมมองจะถูกเมานต์ ส่วนรายการที่เลื่อนพ้นมุมมองจะถูกถอดออก

วิธีนี้ทำให้ DOM ที่ใช้งานอยู่มีขนาดเล็ก ไม่ว่าข้อมูลจะมีรายการมากเพียงใด และแยกขนาด DOM ออกจากขนาดชุดข้อมูล

การคำนวณช่วงรายการที่มองเห็น

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

ไลบรารีใช้ตัวเลขเหล่านี้เพื่อตัดสินใจว่าควรเรนเดอร์ส่วนย่อยของรายการใดในแต่ละขณะ

react-virtualized เทียบกับ react-window และ TanStack Virtual

มีหลายไลบรารีที่ทำหน้าต่างเสมือน react-virtualized มีความสามารถหลากหลายแต่มีขนาดใหญ่กว่า ส่วน react-window เป็นการเขียนใหม่โดยผู้เขียนคนเดียวกันที่มีขนาดเล็กและเน้นเฉพาะด้าน และ TanStack Virtual เป็นตัวเลือกสมัยใหม่ที่ไม่มีส่วนติดต่อผู้ใช้ในตัว

สำหรับรายการส่วนใหญ่ react-window ให้สมดุลที่ยอดเยี่ยมระหว่างความเรียบง่ายและประสิทธิภาพ นี่จึงเป็นเหตุผลที่หลักสูตรนี้เน้นใช้งานไลบรารีดังกล่าว

เมื่อใดจึงจำเป็นต้องใช้เวอร์ชวลไลเซชัน

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

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

เมื่อไม่คุ้มค่าที่จะใช้

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

ควรใช้การทำหน้าต่างเสมือนกับชุดข้อมูลที่มีขนาดใหญ่จริง ๆ เท่านั้น ส่วนชุดข้อมูลขนาดเล็ก การใช้ map แบบธรรมดาจะเรียบง่ายกว่าและทำงานได้เร็วเพียงพอ

ประโยชน์ที่ได้รับ

เมื่อใช้การทำหน้าต่างเสมือน รายการที่มี 100,000 รายการจะเก็บไว้ใน DOM เฉพาะจำนวนเล็กน้อยที่มองเห็นได้ ดังนั้นการเรนเดอร์ครั้งแรกจึงรวดเร็ว ใช้หน่วยความจำน้อย และเลื่อนได้อย่างลื่นไหล

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

ตรวจสอบอย่างรวดเร็ว: เมื่อใดควรใช้เวอร์ชวลไลเซชัน

ตัดสินใจว่าเมื่อใดเวอร์ชวลไลเซชันจึงคุ้มค่า

สรุป: ปัญหาของรายการขนาดใหญ่

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

react-window เป็นตัวเลือกที่เน้นเฉพาะด้านและมีน้ำหนักเบาเมื่อเทียบกับ react-virtualized และ TanStack Virtual ควรใช้กับรายการขนาดใหญ่หรือมีเนื้อหาหนัก และไม่ต้องใช้กับรายการสั้นที่เรียบง่าย

คำถามที่พบบ่อย

บทเรียน “ปัญหาการเรนเดอร์รายการขนาดใหญ่” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “ปัญหาการเรนเดอร์รายการขนาดใหญ่” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส React Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส React Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “ปัญหาการเรนเดอร์รายการขนาดใหญ่”

ทำความเข้าใจว่าเหตุใดการเรนเดอร์โหนด DOM จำนวน 10,000 โหนดจึงทำให้ประสิทธิภาพตกลงอย่างมาก และเวอร์ชวลไลเซชันช่วยแก้ปัญหาได้อย่างไร คุณปฏิบัติ React Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน React Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน React Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน

บทเรียน “ปัญหาการเรนเดอร์รายการขนาดใหญ่” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน React Academy นี้ได้ไหม

ได้ บทเรียน React Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ปัญหาการเรนเดอร์รายการขนาดใหญ่
  2. FixedSizeList: การเรนเดอร์รายการหลายพันรายการ
  3. VariableSizeList: ความสูงแถวแบบไดนามิก
  4. การผสานเวอร์ชวลไลเซชันกับการดึงข้อมูล
← กลับไปที่ React Academy