Single-File Components
ใน React “component” คือไฟล์ JavaScript ที่มีฟังก์ชัน return JSX มักจับคู่กับไฟล์ CSS แยกต่างหากหรือการตั้งค่า CSS-in-JS ใน Svelte component คือ ไฟล์ .svelte เพียงหนึ่งไฟล์ ที่รวม logic, markup และ style ไว้ในที่เดียว โครงสร้างนี้จะรู้สึกคุ้นเคยทันทีหากคุณเคยเขียน HTML ธรรมดา
สามส่วนของไฟล์
หัวข้อที่มีชื่อว่า “สามส่วนของไฟล์”ไฟล์ .svelte มีสามส่วนที่เป็น optional เรียงตามลำดับใดก็ได้ (ตามธรรมเนียมคือ script → markup → style):
<script> // Component logic — reactive state, props, functions</script>
<!-- Markup — the template, like JSX but real HTML -->
<style> /* Scoped CSS — automatically applies only to this component */</style>มีแค่ markup section เท่านั้นที่จำเป็น Svelte component ที่ valid สามารถเป็นแค่ <p>Hello</p> เพียงบรรทัดเดียวโดยไม่มี <script> หรือ <style> เลยก็ได้
ไฟล์ React vs ไฟล์ Svelte
หัวข้อที่มีชื่อว่า “ไฟล์ React vs ไฟล์ Svelte”// UserCard.jsximport styles from './UserCard.module.css';
export default function UserCard({ name, role }) { return ( <article className={styles.card}> <h2 className={styles.name}>{name}</h2> <p className={styles.role}>{role}</p> </article> );}<!-- UserCard.svelte --><script> let { name, role } = $props();</script>
<article class="card"> <h2 class="name">{name}</h2> <p class="role">{role}</p></article>
<style> .card { border: 1px solid #ccc; border-radius: 8px; padding: 1rem; } .name { margin: 0; font-size: 1.25rem; } .role { margin: 0; color: #666; }</style>สังเกตความแตกต่าง:
- ไม่มีไฟล์
UserCard.module.cssแยก — style อยู่ในไฟล์เดียวกัน classNameกลายเป็นclass(HTML attribute จริง ๆ)- Props ประกาศด้วย
$props()แทน function arguments - ไม่มี
export default— ไฟล์เองคือ export - ไม่มี JSX
return— markup แค่อยู่ตรงนั้นเลย