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

แนะนำ — ทำไม Svelte ถึงน่าสนใจสำหรับ React Developer

คุณรู้จัก React อยู่แล้ว คุณเข้าใจ component, props, state และ render cycle Svelte สร้างขึ้นบนแนวคิดเดียวกันแต่แก้ปัญหาต่างออกไป — ในฐานะ compiler ไม่ใช่ runtime library คอร์สนี้จะแสดงให้คุณเห็นอย่างชัดเจนว่าอะไรเปลี่ยนไป อะไรยังคุ้นเคย และวิธีนำ React intuition ของคุณมาใช้กับ Svelte 5

React ส่ง JavaScript runtime (~45 kB gzip สำหรับ React + ReactDOM) ที่รันใน browser และจัดการ virtual DOM tree ทุกครั้งที่เรียก setState จะเกิด reconciliation pass: React diff vDOM ใหม่กับอันก่อนหน้าแล้ว patch real DOM

Svelte ทำงานที่ build time ไฟล์ .svelte ของคุณถูก compile เป็น JavaScript ที่กระชับและปราศจาก framework ที่คุยกับ DOM โดยตรง ไม่มี virtual DOM ให้ diff ไม่มี reconciler ที่ต้องส่งไป ผลลัพธ์คือ document.createElement และ element.textContent = ล้วนๆ — สิ่งที่ browser ต้องการน้อยที่สุด

ผลที่เกิดขึ้นจริง:

  • Bundle ขนาดเล็กลง Svelte app แทบไม่มี framework overhead เลย “Hello World” Svelte component compile ออกมาได้เพียงไม่กี่ร้อย bytes
  • อัปเดตเร็วขึ้น แทนที่จะ diff vDOM tree โค้ด Svelte ที่ compile แล้วจะอัปเดต DOM node เฉพาะที่เปลี่ยนจริงๆ โดยตรง
  • ไม่ต้อง import React component ของคุณเป็น standalone compiled module

React ต้องการการประกาศ state อย่างชัดเจน (useState) และ setter function แยกต่างหากสำหรับทุก reactive state ใน Svelte 5 คุณประกาศ reactive state ด้วย $state() และ mutate ด้วยการ assign ตรงๆ — compiler จะ instrument การ mutation ให้คุณเอง

React
function Greeting() {
const [name, setName] = React.useState('World');
return (
<div>
<input value={name} onChange={e => setName(e.target.value)} />
<p>Hello, {name}!</p>
</div>
);
}
Svelte
<script>
let name = $state('World');
</script>
<input bind:value={name} />
<p>Hello, {name}!</p>

สังเกตสิ่งที่หายไปในเวอร์ชัน Svelte:

  • ไม่ต้อง import useState, ไม่มี setter function (setName)
  • name ถูกประกาศครั้งเดียวด้วย $state() — แค่ assign ค่าใหม่ก็เพียงพอที่จะ trigger re-render
  • bind:value จัดการ two-way sync ระหว่าง input กับตัวแปรให้เอง (ไม่ต้องต่อสาย onChange)

React ไม่มีความเห็นเกี่ยวกับ CSS ทีมต่างๆ ใช้ CSS Modules, styled-components, Tailwind หรือผสมกัน Svelte ส่ง scoped styles มาเป็น first-class language feature: <style> block ภายในไฟล์ .svelte จะ ถูก scope โดยอัตโนมัติ ให้กับ component นั้น ไม่ต้องการ tooling เพิ่มเติม ไม่มีการตั้งค่า class name mangling ไม่มี runtime overhead

<style>
/* This rule only affects <p> tags inside THIS component */
p { color: steelblue; font-size: 1.2rem; }
</style>

ตอน compile Svelte สร้าง attribute เฉพาะ (เช่น svelte-abc123) และเขียน selector ใหม่เป็น p[svelte-abc123] styles ภายนอกไม่รั่วเข้ามา styles ของคุณก็ไม่รั่วออกไป

โมดูลหัวข้อ
แนะนำCompiler model, reactivity พื้นฐาน, scoped styles
ComponentsProps, events, slots/snippets, lifecycle
Reactivity$state, $derived, $effect, stores
Bindingsbind:value, bind:checked, bind:this
Control Flow{#if}, {#each}, {#await}, {#key}
StylingScoped styles, global styles, CSS variables, transitions
RoutingSvelteKit pages, layouts, load functions
AdvancedContext API, actions, custom stores, TypeScript
React
function App() {
const [name, setName] = React.useState('React developer');
const [count, setCount] = React.useState(0);
return (
<div>
<input value={name} onChange={e => setName(e.target.value)} />
<p>Hello, {name}!</p>
<button onClick={() => setCount(c => c + 1)}>
Clicked {count} {count === 1 ? 'time' : 'times'}
</button>
</div>
);
}
Svelte
<script>
let name = $state('Svelte developer');
let count = $state(0);
</script>
<input bind:value={name} />
<p>Hello, {name}!</p>
<button onclick={() => count++}>
Clicked {count} {count === 1 ? 'time' : 'times'}
</button>

Playground ด้านล่างนี้เป็น Svelte 5 component ที่สมบูรณ์และแก้ไขได้ เปลี่ยนชื่อ กดปุ่ม ปรับแต่ง style — ทุกอย่างรันใน browser ของคุณ

อะไรคือสิ่งที่ทำให้ Svelte แตกต่างจาก React อย่างพื้นฐาน?
คุณสร้าง reactive state ใน Svelte 5 ได้อย่างไร?
สไตล์ใน Svelte component ถูก scope อย่างไร?