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

Routing ด้วย SvelteKit

React ไม่มี router ในตัว แอป React ส่วนใหญ่จึงใช้ react-router (กำหนด route ด้วย component <Route> แบบ declarative) หรือใช้ framework อย่าง Next.js (routing แบบ file-based ใน pages/ หรือ app/) SvelteKit คือ full-stack framework ของ Svelte และ routing ถูกรวมอยู่ในตัวแล้ว — คุณไม่จำเป็นต้องติดตั้ง package router เพิ่มเติมเลย

การเปลี่ยนแนวคิดนั้นง่ายมาก: file system ของคุณคือ route map ไฟล์ทุกไฟล์ที่คุณสร้างใต้ src/routes/ จะกลายเป็น URL โดยอัตโนมัติ ไม่ต้องมี JSX route config ไม่ต้องมี createBrowserRouter ไม่ต้องมี wrapper <Routes>

รันคำสั่งนี้ในโปรเจกต์ SvelteKit (npx sv create)

SvelteKit จอง src/routes/ ไว้สำหรับ route tree ของคุณ โครงสร้างของไดเรกทอรีนี้คือโครงสร้าง URL ของแอปพลิเคชัน

ไฟล์URL
src/routes/+page.svelte/
src/routes/about/+page.svelte/about
src/routes/blog/[slug]/+page.svelte/blog/:slug
src/routes/dashboard/+layout.svelteครอบทุกหน้าใต้ /dashboard/*

SvelteKit ใช้ convention ของ ชื่อไฟล์ที่ขึ้นต้นด้วย + เพื่อให้ไฟล์ที่เป็นของ SvelteKit ไม่ปะปนกับ helper module ของคุณเองที่อยู่ในโฟลเดอร์เดียวกัน

ชื่อไฟล์หน้าที่
+page.svelteUI ของหน้าที่แสดงผลที่ route นี้
+page.jsฟังก์ชัน load() — รันทั้งบน server และ client
+page.server.jsฟังก์ชัน load() — รันบน server เท่านั้น (DB, cookies, secrets)
+layout.svelteShell ที่แชร์กัน ครอบทุก child route ในโฟลเดอร์นี้
+layout.js / +layout.server.jsload() สำหรับ layout
+error.svelteError boundary สำหรับ route segment นี้

ถ้าคุณมาจาก react-router การเปลี่ยน mental model คือ:

  • react-router: คุณเขียน config แบบ JS/JSX ที่แมป path string ไปยัง component import
  • Next.js Pages Router: โฟลเดอร์ pages/ — ไฟล์แมปไปยัง route
  • Next.js App Router: โฟลเดอร์ app/ — ไฟล์ page.tsx ในโฟลเดอร์ต่าง ๆ แมปไปยัง route
  • SvelteKit: โฟลเดอร์ src/routes/ — ไฟล์ +page.svelte ในโฟลเดอร์ต่าง ๆ แมปไปยัง route

SvelteKit ใกล้เคียงกับ Next.js App Router มากที่สุด แต่ใช้ +page.svelte แทน page.tsx และจัดการ data loading ใน +page.js / +page.server.js แทนที่จะทำให้ตัว component เป็น async

บทเรียนแนวคิด
หน้านี้Mental model: file-based routing และไดเรกทอรี src/routes/
File-based routingNested routes, dynamic segment แบบ [param], walkthrough ของ file tree
Load functions+page.js / +page.server.js สำหรับดึงข้อมูล — เทียบกับ react-router loaders และ getServerSideProps
SvelteKit route อยู่ในไดเรกทอรีไหน?
ไฟล์ชื่อ +page.svelte แทนความหมายอะไรใน SvelteKit?
SvelteKit routing แตกต่างจาก react-router อย่างไร?