ในส่วนที่ 3 ของซีรีส์ “การเพิ่มประสิทธิภาพ” ของฉัน คุณจะได้เรียนรู้วิธีทำให้โครงการเว็บของคุณมีประสิทธิภาพและรวดเร็วยิ่งขึ้นโดยการปรับ DOM ให้เหมาะสม
จำกัดจำนวนองค์ประกอบ HTML
โครงสร้าง DOM ขนาดใหญ่อาจทำให้ประสิทธิภาพเว็บไซต์ของคุณช้าลง คุณควรจำกัดจำนวนโหนด HTML ให้มากที่สุด เมื่อโหลดเพจ — ในโลกที่สมบูรณ์แบบ — ควรแสดงเฉพาะโหนดที่ผู้ใช้มองเห็นได้ เนื้อหาที่ปรากฏหลังจากการเลื่อนเท่านั้นหรือเช่น โมดอลที่เปิดหลังจากการโต้ตอบเท่านั้นควรรวมเข้ากับ DOM เท่านั้น คุณควรลบโหนดที่เคยใช้แต่ไม่จำเป็นอีกต่อไปแล้ว
เมื่อใช้ Bootstrap กับ flexbox คุณจะมีโครงสร้าง DOM ที่ลึกกว่าเมื่อใช้ grid โดยอัตโนมัติ คุณสามารถละเว้นระดับขององค์ประกอบแถวได้อย่างสมบูรณ์ที่นี่ และคุณสามารถควบคุมเค้าโครงได้โดยระบุที่อยู่คอนเทนเนอร์หลัก:
/* Using Bootstrap with flexbox */ <div class="container"> <div class="row"> <div class="gr-4">...</div> <div class="gr-8">...</div> </div> <div class="row"> <div class="gr-4">...</div> <div class="gr-8">...</div> </div> </div> /* Using grid without Bootstrap */ <div class="container"> <div>...</div> <div>...</div> <div>...</div> <div>...</div> </div>
ผู้สังเกตการณ์ทางแยกเพื่อช่วยเหลือ
คุณสามารถใช้ IntersectionObserver API เพื่อตรวจจับเวลาและสถานที่ที่ผู้ใช้เลื่อนหน้าจอ เพื่อให้คุณสามารถโหลดเนื้อหาของคุณแบบ Lazy Loading ได้ ดูตัวอย่างรูปภาพและส่วนประกอบการโหลดแบบ Lazy Load ในส่วนการโหลดแบบ Lazy Load ใน "ส่วนหนึ่งของซีรีส์การเพิ่มประสิทธิภาพการทำงานของฉัน"
ขนาดการถ่ายโอนที่ต่ำกว่า
หากคุณใช้องค์ประกอบ DOM น้อยลง ขนาดการถ่ายโอนข้อมูลก็จะลดลงด้วย ซึ่งจะทำให้ผู้ใช้อุปกรณ์มือถือพอใจเป็นพิเศษ
ในขณะเดียวกัน ปริมาณการใช้ข้อมูลและภาระบนเซิร์ฟเวอร์ก็ลดลง ซึ่งเป็นข้อดีสำหรับสภาพแวดล้อมของเราด้วย นอกจากนี้ เซิร์ฟเวอร์ยังสามารถส่งเว็บไซต์ได้เร็วขึ้นเมื่อมีภาระงานต่ำได้ง่ายขึ้น
ประสิทธิภาพรันไทม์และประสิทธิภาพของหน่วยความจำ
DOM ขนาดใหญ่ที่มีกฎ CSS ที่ซับซ้อนจำนวนมากอาจทำให้การแสดงผลหน้าเว็บของคุณช้าลงได้
หากคุณมีขนาด DOM มากเกินไปและคุณใช้ตัวเลือกการค้นหาทั่วไป เช่น document.querySelectorAll('div')
คุณสามารถจัดเก็บการอ้างอิงไปยังโหนดจำนวนมากได้ ซึ่งอาจทำให้หน่วยความจำของอุปกรณ์ของผู้ใช้ของคุณแทบจะคุกเข่าลงได้
หลีกเลี่ยงการอัพเดตโหนดพาเรนต์
หากคุณจัดการคุณสมบัติ CSS ของโหนดพาเรนต์โดยใช้ JavaScript ก็อาจส่งผลให้องค์ประกอบย่อยทั้งหมดต้องถูกเรนเดอร์ใหม่เช่นกัน ดังนั้นควรพยายามจัดการกับองค์ประกอบทางตรงเสมอ ซึ่งจะทำให้มีการคำนวณใหม่น้อยที่สุด
ส่ง HTML แบบคงที่
ให้ฝั่งเซิร์ฟเวอร์สร้าง HTML ของคุณสำหรับเส้นทางการเรนเดอร์ที่สำคัญล่วงหน้า ถ้าเป็นไปได้ HTML ไม่ควรถูกสร้างขึ้นโดยภาษาเซิร์ฟเวอร์เมื่อมีการเรียก แต่ควรใช้ภาษาสคริปต์ของเซิร์ฟเวอร์เพื่อจัดเก็บและแคช HTML ที่แสดงผลแล้วเป็นไฟล์ ซึ่งจะช่วยประหยัดค่าใช้จ่าย (เช่น การเชื่อมต่อฐานข้อมูล) ในการประกอบเพจเป็นอันดับแรกเมื่อผู้ใช้มาถึงเว็บไซต์ของคุณ
โครงสร้างพื้นฐานของเว็บไซต์ HTML คงที่ บางครั้งเป็นสิ่งที่คุณต้องการสำหรับเส้นทางการเรนเดอร์ที่สำคัญ อาจมีลักษณะดังนี้:
<html> <head>...</head> <body> <div class="wrap"> <header class="header"> <img class="header--logo" src="logo.svg" alt="Logo"> <nav class="header--nav"> <ul> <li><a href="">Home</a></li> ... </ul> </nav> </header> <section class="content"> <h1>Welcome</h1> <p>Teaser Text</p> </section> <!-- insert dynamic content here --> <footer class="footer">...</footer> </div> </body> </html>
หากต้องการเพิ่มเนื้อหาเพิ่มเติมให้กับ DOM ที่ไม่ส่งผลต่อเส้นทางการเรนเดอร์ที่สำคัญ มีหลายวิธีที่จะตามมาในตอนนี้...
อาคาร
การโหลดแบบ Lazy Loading ด้วยส่วนหน้าหมายถึงการโหลดส่วนประกอบของบุคคลที่สามล่าช้า โดยมี HTML แบบคงที่หรือรูปภาพถูกโหลดก่อน ซึ่งจะถูกแทนที่ด้วยส่วนประกอบที่ถูกต้องเมื่อผู้ใช้โต้ตอบเท่านั้น วิธีนี้ช่วยประหยัดการโหลดข้อมูลภายนอกโดยไม่จำเป็น ซึ่งส่วนใหญ่เป็น JavaScript ซึ่งเรามักไม่มีโอกาสปรับประสิทธิภาพให้เหมาะสม
ตามข้อมูลของ Google ควรเพิ่มส่วนหน้าให้กับ DOM ในระหว่างเหตุการณ์ onload ของเว็บไซต์ โดยวางเมาส์ไว้เหนือ จากนั้นจะสามารถเชื่อมต่อกับแหล่งข้อมูลของบุคคลที่สามล่วงหน้าได้ และเพียงคลิกเดียวเท่านั้นที่ส่วนหน้าจะแลกเปลี่ยนกับเนื้อหาของบุคคลที่สาม
การใช้งานด้านหน้าอาคารที่ดี ได้แก่ Google Maps วิดเจ็ตปฏิทิน หรือเครื่องเล่นวิดีโอ เช่น จาก YouTube หรือ Vimeo
เงา DOM
ตอนนี้เรามาดูด้านมืดของ DOM กันดีกว่า...
Shadow DOM ใช้เพื่อสร้างองค์ประกอบ HTML แบบกำหนดเอง — ที่เรียกว่าส่วนประกอบของเว็บ — ซึ่งแนบไปกับ DOM ผ่านทางรูทเงา การปรับเปลี่ยน DOM บางอย่าง (การเพิ่มหรือการลบโหนด HTML) อาจนำไปสู่การจัดเรียงใหม่และทาสีเค้าโครงใหม่ ซึ่งอาจส่งผลเสียต่อประสบการณ์ของผู้ใช้ การจัดการภายใน Shadow DOM จะไม่ส่งผลต่อ DOM ดังนั้นจึงไม่ทำให้เกิดการทาสีใหม่หรือการจัดเรียงใหม่ ซึ่งอาจทำให้การเรนเดอร์ใหม่เร็วขึ้นได้
ในตัวอย่างต่อไปนี้ คุณสามารถดูวิธีการเพิ่มสไตล์ชีตภายนอกให้กับ Shadow DOM ในทำนองเดียวกัน องค์ประกอบ HTML อื่นๆ ก็สามารถสร้างได้ใน Shadow DOM
// Create an external stylesheet const style = document.createElement("link"); style.setAttribute("rel", "stylesheet"); style.setAttribute("href", "style.css"); // Create the shadow root const shadow = this.attachShadow({ mode: "open" }); // Attach the created stylesheet to the shadow DOM shadow.appendChild(style);
อ่านเพิ่มเติมเกี่ยวกับ Shadow DOM ในส่วน "ลิงก์ที่มีประโยชน์" ด้านล่าง
เอกสารแฟรกเมนต์
ด้วยอินเทอร์เฟซ JavaScript DocumentFragment คุณสามารถสร้างโหนด DOM และเพิ่มลงใน DOM ที่ใช้งานอยู่ได้
เช่นเดียวกับ Shadow DOM การเปลี่ยนแปลง DocumentFragment จะไม่ส่งผลกระทบต่อส่วนที่เหลือของ DOM และไม่ลดประสิทธิภาพการทำงาน
// Create a list of fruits let fruits = ['Apple', 'Banana', 'Cherry', 'Pineapple']; // Grab a empty <ul> element with the id #fruits existing in your HTML let fruitsUl = document.querySelector('#fruits'); // Create a document fragment let fragment = new DocumentFragment(); // Append content to the fragment fruits.forEach((fruit) => { let li = document.createElement('li'); li.innerHTML = fruit; fragment.appendChild(li); }); // Append the fragment to your <ul> fruitsUl.appendChild(fragment);
DOM เสมือน — การให้น้ำ
Hydration เป็นเทคโนโลยีที่ให้ HTML แบบคงที่ก่อน เพิ่มการโต้ตอบกับองค์ประกอบในภายหลังโดยการสร้างสิ่งที่เรียกว่า Virtual DOM ในกรณีของภาวะขาดน้ำบางส่วน ไม่ใช่ว่าทุกองค์ประกอบจะได้รับน้ำ แต่จะมีเฉพาะองค์ประกอบที่มีพฤติกรรมโต้ตอบเท่านั้น ที่นี่ คุณจะได้รับประโยชน์จากการแสดงผลฝั่งเซิร์ฟเวอร์เพื่อปรับปรุง First Input Delay (FID) ของการวัดของ Google
อีกทางเลือกหนึ่งคือการให้ความชุ่มชื้นแบบก้าวหน้า โดยที่แต่ละส่วนประกอบจะถูกโหลดในภายหลังทันทีที่มองเห็นได้บนหน้าจอ
ไฮเดรชั่นถูกใช้โดยเฉพาะสำหรับการใช้งานหน้าเดียว เฟรมเวิร์กเช่น React หรือ NextJS ใช้ไฮเดรชั่น
ลิงค์ที่มีประโยชน์
หลีกเลี่ยงขนาด DOM ที่มากเกินไป
โหลดขี้เกียจด้วยด้านหน้า
เงา DOM
เอกสารแฟรกเมนต์
การให้ความชุ่มชื้น
วิดีโอข้อมูลเชิงลึกเกี่ยวกับประสิทธิภาพ
อะไรต่อไป?
ในส่วนถัดไปของซีรีส์การเพิ่มประสิทธิภาพของฉัน ฉันจะมุ่งเน้นไปที่การเพิ่มประสิทธิภาพเซิร์ฟเวอร์ของคุณและความเร็วหน้าของ JavaScript
คอยติดตาม…