Virtual DOM คืออะไร? เบื้องหลังความเร็วระดับเทพของ Vue และ React

1. 🎯 ตอนที่ 10: เจาะลึก Virtual DOM อาวุธลับที่ทำให้ Framework ยุคใหม่เร็วทะลุนรก
2. 📖 เปิดฉาก (The Hook)
น้องๆ เคยสงสัยไหมครับว่า ทำไม Framework ยุคใหม่อย่าง React หรือ Vue ถึงได้รับการยกย่องว่า “ทำงานได้เร็วและลื่นไหลมาก” เมื่อเทียบกับการที่เราเขียน JavaScript (หรือ jQuery) เพื่อเข้าไปสั่งการหน้าเว็บแบบตรงๆ ในยุคก่อน?
ในอดีต เวลาที่เราต้องการเปลี่ยนข้อความ หรืออัปเดตข้อมูลบนหน้าจอ เราต้องสั่งให้เบราว์เซอร์ไปค้นหาชิ้นส่วนนั้นบนหน้าเว็บ (Real DOM) แล้วทำการวาดใหม่ทั้งหมด ถ้าหน้าเว็บมีขนาดเล็กก็คงไม่เป็นไรครับ แต่ลองจินตนาการถึงเว็บแอปพลิเคชันสเกลยักษ์ที่มีชิ้นส่วนนับพันชิ้น การไปแตะต้อง DOM บ่อยๆ มันเปรียบเสมือนการ “ทุบตึกทั้งชั้นเพื่อเปลี่ยนแค่เฟอร์นิเจอร์ชิ้นเดียว” ซึ่งกินทรัพยากรเครื่องอย่างมหาศาล
จนกระทั่งวันหนึ่ง โลกของ Frontend ก็ได้รู้จักกับสิ่งที่เรียกว่า “Virtual DOM” ซึ่งเป็นแนวคิดที่ React บุกเบิกขึ้นมา และ Vue ก็นำมาปรับใช้และพัฒนาต่อยอดได้อย่างยอดเยี่ยม วันนี้พี่จะพามาจิบกาแฟ แงะดูใต้กระโปรงรถสปอร์ตคันนี้กันครับว่า เจ้า Virtual DOM มันทำงานอย่างไร และทำไมมันถึงกลายเป็น “มาตรฐานทองคำ” ของ Web Development ยุคปัจจุบัน
3. 🧠 แก่นวิชา (Core Concepts)
🧱 Real DOM คืออะไร?
ก่อนอื่นเราต้องรู้จัก DOM (Document Object Model) กันก่อนครับ เมื่อเบราว์เซอร์โหลดหน้าเว็บ HTML มันจะแปลงโค้ด HTML ของเราให้กลายเป็น “โครงสร้างต้นไม้ (Tree structure)” ที่เต็มไปด้วย Node (เช่น
👻 Virtual DOM: พิมพ์เขียวจำลอง
Virtual DOM (VDOM) คือแนวคิดในการสร้าง “ตัวแทนจำลอง” ของ UI หน้าเว็บเอาไว้ในหน่วยความจำ (Memory) โดยจะอยู่ในรูปแบบของ Plain JavaScript Object (อ็อบเจกต์ธรรมดาๆ ของ JS) ที่เราเรียกว่า VNode การสร้างหรืออัปเดต VNode ด้วย JavaScript นั้นกินทรัพยากรน้อยมากและทำได้รวดเร็วสุดๆ
🏗️ อุปมาอุปไมย: “พิมพ์เขียวตึก 29 ชั้น”
เพื่อให้เห็นภาพชัดเจนที่สุด (อ้างอิงจากบทเรียนของ Evan You ผู้สร้าง Vue) ลองจินตนาการว่าคุณมีตึก 29 ชั้น:
- วันหนึ่งคุณต้องการเปลี่ยนตู้และชุดครัวที่ชั้น 29
- แบบดั้งเดิม (Real DOM): ทุบตึกทิ้งทั้งหมดแล้วสร้างตึกใหม่ตั้งแต่ชั้น 1 ถึง 29 เพื่อให้ได้ครัวใหม่! (ซึ่งช้าและเปลืองมาก)
- แบบ Virtual DOM: คุณเอา “พิมพ์เขียวเก่า” มาเทียบกับ “พิมพ์เขียวใหม่ (Virtual DOM)” ว่ามีจุดไหนต่างกันบ้าง เมื่อพบว่าต่างกันแค่ชุดครัวที่ชั้น 29 ผู้รับเหมาก็เดินขึ้นไปเปลี่ยนแค่ตู้ตรงจุดนั้นจุดเดียว!
🔄 กระบวนการทำงาน (The Render Pipeline)
- Mount (สร้างครั้งแรก): Framework จะรันฟังก์ชัน Render เพื่อสร้าง Virtual DOM Tree ขึ้นมา และนำไปสร้างเป็น Real DOM บนหน้าจอ
- Patch / Diffing (การเปรียบเทียบ): เมื่อข้อมูล (State) เปลี่ยนแปลง Vue หรือ React จะสร้าง Virtual DOM Tree ตัวใหม่ขึ้นมา แล้วนำไป “เดินเปรียบเทียบ” (Walk and Compare) กับ Tree ตัวเก่า เพื่อหาข้อแตกต่าง
- Reconciliation (การอัปเดตจุดที่ต่าง): เมื่อรู้แล้วว่ามีอะไรเปลี่ยนบ้าง ระบบก็จะส่งคำสั่งไปอัปเดตแค่ จุดที่เปลี่ยนแปลงจริงๆ บน Real DOM เท่านั้น!

4. 💻 ร่ายมนต์โค้ด (Show me the Code)
ถ้าอยากรู้ว่าหน้าตาของ Virtual DOM (VNode) เป็นอย่างไร ลองดูตัวอย่างนี้ครับ สมมติเรามีโค้ด HTML ธรรมดาๆ:
<!-- สิ่งที่เราต้องการให้เป็น (Real DOM) -->
<div id="hello">
<p>สวัสดี Virtual DOM</p>
</div>ในโลกของ Framework เบื้องหลังแล้วมันจะถูกแปลงร่างเป็น JavaScript Object (VNode) หน้าตาแบบนี้ครับ:
// สิ่งที่ Framework เห็นใน Memory (Virtual DOM)
const vnode = {
type: 'div', // ชนิดของ Element
props: {
id: 'hello' // Attributes ต่างๆ
},
children: [ // ลูกๆ ที่อยู่ข้างใน
{
type: 'p',
props: null,
children: 'สวัสดี Virtual DOM' // ข้อความก็คือส่วนหนึ่งของ Children
}
]
}ทำไมต้องแปลงเป็น Object? เพราะการเอา JavaScript Object สองตัวมาเปรียบเทียบกัน (Diffing) ในคอมพิวเตอร์นั้น ใช้เวลาเพียงเสี้ยวของเสี้ยววินาทีครับ เมื่อ Framework พบความต่าง (เช่น ข้อความเปลี่ยนจาก ‘สวัสดี’ เป็น ‘ลาก่อน’) มันก็จะหยิบแค่คำว่า ‘ลาก่อน’ ไปสั่งอัปเดต DOM จริง ทำให้หน้าเว็บไม่กระตุกเลย
5. 🛡️ เคล็ดลับจากคัมภีร์ลับ (Under the Hood / Pro-Tips)
✨ จุดตัดที่ทำให้ Vue 3 เหนือกว่า (Compiler-Informed Virtual DOM) แม้ว่า React จะเป็นผู้บุกเบิก Virtual DOM แต่วิธีการเปรียบเทียบ (Reconciliation) ของ React ยังเป็นแบบที่ต้องพึ่งพารันไทม์ (Runtime) ล้วนๆ หมายความว่ามันต้อง “ไล่ตรวจทุกๆ โหนด (Traverse tree)” เพื่อหาความต่าง ซึ่งเปลืองแรงโดยใช่เหตุ
แต่ Vue 3 ได้อัปเกรดกระบวนการนี้ขึ้นไปอีกขั้นด้วยเทคนิค Compiler-Informed Virtual DOM!
ในขั้นตอนที่ Vue แปลงโค้ด <template> ไปเป็น JavaScript ระบบ Compiler ของ Vue ฉลาดพอที่จะ “วิเคราะห์ล่วงหน้า” ว่าส่วนไหนของหน้าเว็บคือ “ส่วนที่อยู่นิ่งๆ (Static)” และส่วนไหนคือ “ส่วนที่เคลื่อนไหวได้ตามตัวแปร (Dynamic)”
- Cache Static (การแคชส่วนที่อยู่นิ่ง): ถ้ามีไหนที่เป็นข้อความธรรมดา ไม่ได้ผูกกับตัวแปร Vue จะไม่สร้าง VNode ใหม่ทุกรอบ แต่จะใช้ตัวเดิมตลอดกาล (ข้ามการ Diff ไปเลย)
- Patch Flags (ป้ายแปะบอกทาง): Vue จะแปะ “ธง” ไว้ที่ Element ที่มีการใช้ข้อมูลแบบ Dynamic ทำให้ตอนที่ State เปลี่ยน ตัว Diffing Algorithm สามารถ “กระโดดข้าม” ไปเช็คเฉพาะจุดที่มีธงแปะอยู่ได้เลย (Tree Flattening) ไม่ต้องมุดหาให้เหนื่อย!
ด้วยการผสานเอาพลังของ ระบบ Reactivity ที่คอยติดตามข้อมูล เข้ากับ Virtual DOM ที่ฉลาดขึ้น ทำให้ Vue 3 มีประสิทธิภาพที่สูงกว่าโดยที่เราแทบไม่ต้องเขียนโค้ด Optimize (เช่น การใช้
useMemoแบบฝั่ง React) ด้วยตัวเองเลยครับ!6. 🏁 บทสรุป (To be continued…)
Virtual DOM ไม่ใช่เวทมนตร์ดำ แต่มันคือวิศวกรรมซอฟต์แวร์ที่ชาญฉลาดในการนำ JavaScript Object มาเป็น “ตัวกลาง (Blueprint)” เพื่อลดภาระการทำงานที่หนักหน่วงของเบราว์เซอร์
การเข้าใจว่า Virtual DOM ทำงานอย่างไร จะช่วยให้เราออกแบบ Component ได้ดีขึ้น (เช่น การใส่
:keyในv-forเพื่อช่วยให้ Algorithm การ Diff ของ Vue ทำงานได้แม่นยำขึ้นโดยไม่ต้องทำลายทิ้งแล้วสร้างใหม่) ในบทถัดไป เราจะเจาะลึกเข้าไปดูว่า การแยกหน้าจอออกเป็นชิ้นๆ หรือที่เรียกว่า Component Architecture นั้น จะช่วยให้เราสร้างแอปพลิเคชันสเกลใหญ่ได้อย่างไร ติดตามกันต่อได้เลยครับ!ต้องการที่ปรึกษาและพัฒนาระบบ Web Application หรือ Frontend Architecture ให้กับธุรกิจของคุณ? ทีมงาน WP Solution พร้อมให้บริการออกแบบและพัฒนาซอฟต์แวร์แบบครบวงจร ดูรายละเอียดบริการของเราได้ที่: www.wpsolution2017.com หรือพูดคุยปรึกษาเบื้องต้นได้ที่ Line: wisit.p