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

File-based Routing

ใน SvelteKit โครงสร้างโฟลเดอร์ใต้ src/routes/ คือ URL ของแอปพลิเคชันโดยตรง ไม่มีขั้นตอนการกำหนด route เพิ่มเติม — แค่สร้างไฟล์และโฟลเดอร์ที่ถูกต้อง แล้ว SvelteKit จะจัดการ routing ให้เอง บทเรียนนี้จะพาคุณไปดู route patterns หลัก ๆ ทั้งหมด พร้อมเปรียบเทียบกับ react-router และ Next.js

flowchart TB
  routes(["src/routes/"])
  routes --> rootPage["+page.svelte → /"]
  routes --> about["about/"]
  about --> aboutPage["+page.svelte → /about"]
  routes --> blog["blog/"]
  blog --> blogPage["+page.svelte → /blog"]
  blog --> slug["[slug]/"]
  slug --> slugPage["+page.svelte → /blog/:slug"]
  routes --> dashboard["dashboard/"]
  dashboard --> dashLayout["+layout.svelte (shared layout)"]
  dashboard --> dashPage["+page.svelte → /dashboard"]
  dashboard --> settings["settings/"]
  settings --> settingsPage["+page.svelte → /dashboard/settings"]
SvelteKit src/routes/ file tree

ทุกโฟลเดอร์คือ URL segment ทุกไฟล์ +page.svelte คือหน้าที่จะแสดงผลที่ URL นั้น ส่วน +layout.svelte ครอบทุก sibling และ child route ในโฟลเดอร์เดียวกัน

เปรียบเทียบวิธีกำหนด static route /about ใน react-router, Next.js และ SvelteKit:

React
// react-router v6
import { createBrowserRouter } from 'react-router-dom';
import About from './pages/About';
const router = createBrowserRouter([
{ path: '/about', element: <About /> },
]);
Svelte
<!-- src/routes/about/+page.svelte -->
<h1>About</h1>
<p>ไม่มี config — แค่วางไฟล์นี้ไว้ในโฟลเดอร์ about/</p>

ด้านซ้ายต้องมี import, config object และ router instance ด้านขวาแค่สร้างไฟล์ในโฟลเดอร์ที่ถูกต้อง

ชื่อโฟลเดอร์ที่ห้อมล้อมด้วยวงเล็บเหลี่ยมกลายเป็น dynamic segment คุณอ่านค่า param ใน +page.svelte ผ่าน page.params:

React
// react-router v6
{ path: '/blog/:slug', element: <BlogPost /> }
// BlogPost.jsx
import { useParams } from 'react-router-dom';
function BlogPost() {
const { slug } = useParams();
return <h1>Post: {slug}</h1>;
}
Svelte
<!-- src/routes/blog/[slug]/+page.svelte -->
<script>
import { page } from '$app/state';
</script>
<h1>Post: {page.params.slug}</h1>

ชื่อโฟลเดอร์ [slug] คือชื่อ key ของ params โดยตรง — เหมือนกับ :slug ใน react-router หรือ [slug] ใน Next.js

+layout.svelte ใน level ใด ๆ จะครอบทุก route ในโฟลเดอร์นั้นและโฟลเดอร์ลูก ซึ่งสอดคล้องกับ layout.tsx ของ Next.js App Router หรือ <Outlet> ของ react-router:

React
// react-router v6 — nested layout
{ path: '/dashboard',
element: <DashboardLayout />,
children: [
{ index: true, element: <DashboardHome /> },
{ path: 'settings', element: <Settings /> },
]
}
// DashboardLayout.jsx
import { Outlet } from 'react-router-dom';
function DashboardLayout() {
return (
<div>
<nav>Dashboard nav</nav>
<Outlet />
</div>
);
}
Svelte
<!-- src/routes/dashboard/+layout.svelte -->
<script>
let { children } = $props();
</script>
<nav>Dashboard nav</nav>
{@render children()}
<!-- src/routes/dashboard/+page.svelte -->
<h1>Dashboard Home</h1>
<!-- src/routes/dashboard/settings/+page.svelte -->
<h1>Settings</h1>

{@render children()} ใน +layout.svelte คือจุดที่ child page จะถูก render เข้าไป — ทำหน้าที่เหมือน <Outlet /> ของ react-router พอดี

คุณสร้าง dynamic route สำหรับ /posts/:id ใน SvelteKit ได้อย่างไร?
SvelteKit equivalent ของ react-router layout route ที่มี <Outlet /> คืออะไร?
SvelteKit ใช้ syntax อะไรสำหรับ dynamic route segment — และต่างจาก react-router อย่างไร?