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

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
// UserCard.jsx
import 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>
);
}
Svelte
<!-- 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 แค่อยู่ตรงนั้นเลย
ส่วนใดของไฟล์ .svelte ที่จำเป็นต้องมี?
ใน Svelte เขียน CSS class attribute อย่างไร?
ใน Svelte ประกาศ props ของ component อย่างไร?
ทำไม Svelte component ถึงไม่ต้องมี "export default"?