ข้ามไปยังเนื้อหา

Compiler Model ของ Svelte

React ส่ง JavaScript runtime ไปให้ browser ของผู้ใช้ทุกคน — ประมาณ 45 kB แบบ gzip สำหรับ React และ ReactDOM รวมกัน runtime นั้นดูแล virtual DOM tree, diff ทุกครั้งที่ state เปลี่ยน และ patch real DOM ตามผล Svelte เลือกแนวทางที่แตกต่างอย่างสิ้นเชิง: ทำงานในฐานะ compiler ไฟล์ .svelte ของคุณจะถูกแปลงเป็น JavaScript ธรรมดาที่ปราศจาก framework ณ เวลา build เมื่อโค้ดถึงมือ browser แล้ว ไม่มี Svelte runtime อยู่เลย — มีแต่คำสั่ง DOM โดยตรงที่ compiler สร้างออกมา

React
// React: ships a runtime to the browser
// 1. render() builds a virtual DOM tree
// 2. React's reconciler diffs old vs new vDOM
// 3. Only changed nodes are patched in the real DOM
// bundle includes React + ReactDOM (~45 kB gzip)
Svelte
// Svelte: compiles your code at build time
// 1. npm run build transforms .svelte → plain JS
// 2. Output: direct DOM instructions (no vDOM)
// 3. element.textContent = count ← surgical update
// zero framework runtime shipped to the browser

ประเด็นสำคัญคือ: แนวคิดของ React คือ render → diff → patch ซึ่งเกิดขึ้นใน browser ณ runtime ส่วนแนวคิดของ Svelte คือ compile → direct DOM update — การ “diffing” ถูกทำโดย compiler ก่อนที่โค้ดจะถูกส่งออกไปเลย ผลลัพธ์คือ bundle ที่เล็กกว่ามาก และไม่มีค่าใช้จ่ายของ runtime ในการ parse หรือ execute framework

component ด้านล่างแสดงให้เห็น compiler model ในทางปฏิบัติ สังเกตว่าไม่มี useState, ไม่มี setter function และไม่มี reconciler compiler วิเคราะห์ว่า DOM node ใดขึ้นอยู่กับ count และสร้าง targeted update ออกมา — เฉพาะ node เหล่านั้นเท่านั้นที่เปลี่ยนเมื่อคุณกดปุ่ม

ลองกดปุ่มและสังเกตว่า label เปลี่ยนแปลงทันทีโดยไม่มี re-render ทั้ง component นี่คือ Svelte compiler ทำงาน — compiler รู้ล่วงหน้าว่า label ขึ้นอยู่กับ count จึงสร้างโค้ดที่อัปเดตเฉพาะ DOM node ที่เกี่ยวข้องโดยตรง

Svelte ทำงานหนักที่สุดเมื่อไหร่?
Svelte ส่งอะไรไปให้ browser แทน framework runtime?
ทำไม Svelte bundle ถึงเล็กกว่า React bundle โดยทั่วไป?