การตั้งค่าโปรเจกต์ Svelte
React มีจุดเริ่มต้นหลักสามแบบ ได้แก่ Create React App (เลิกใช้งานแล้ว), Vite กับ React plugin และ Next.js สำหรับงาน full-stack/SSR Svelte แบ่งแบบเดียวกันแทบทุกอย่าง — Vite + Svelte plugin สำหรับ SPA และ SvelteKit สำหรับ full-stack/SSR ถ้าคุณคุ้นเคยกับ toolchain ของ React คุณก็เข้าใจ shape ของ Svelte อยู่แล้ว เปลี่ยนแค่ชื่อเท่านั้น
คำสั่ง scaffold
หัวข้อที่มีชื่อว่า “คำสั่ง scaffold”| React | Svelte |
|---|---|
npm create vite@latest my-app -- --template react-ts | npm create vite@latest my-app -- --template svelte-ts |
npx create-next-app my-app | npx sv create my-app |
- คำสั่ง Vite เหมือนกันทุกอย่าง ต่างกันแค่ชื่อ template:
react-ts→svelte-ts npx sv createคือ scaffolder อย่างเป็นทางการของ SvelteKit — เทียบเท่ากับcreate-next-appโดยตรง จะถามว่าต้องการ TypeScript, ESLint, Prettier, Vitest และอื่นๆ หรือไม่
สร้าง Svelte SPA ด้วย Vite
หัวข้อที่มีชื่อว่า “สร้าง Svelte SPA ด้วย Vite”npm create vite@latest my-app -- --template svelte-tscd my-appnpm installnpm run devสร้าง SvelteKit (เทียบเท่า Next.js)
หัวข้อที่มีชื่อว่า “สร้าง SvelteKit (เทียบเท่า Next.js)”npx sv create my-appcd my-appnpm installnpm run devscripts ใน package.json — เกือบเหมือนกันทุกอย่าง
หัวข้อที่มีชื่อว่า “scripts ใน package.json — เกือบเหมือนกันทุกอย่าง”เนื่องจากทั้งสอง ecosystem ใช้ Vite เป็น base scripts จึงดูเกือบเหมือนกัน ความต่างเพียงอย่างเดียวคือ template ของ React/Vite รัน tsc ก่อน vite build เพื่อตรวจ type
{ "scripts": { "dev": "vite", "build": "tsc && vite build", "preview": "vite preview" }}{ "scripts": { "dev": "vite", "build": "vite build", "preview": "vite preview" }}หมายเหตุ Playground: บทนี้เป็นเรื่องการ scaffold โปรเจกต์ — ไม่มี snippet ที่รันใน browser ได้ รันคำสั่งด้านบนใน terminal ของคุณเพื่อสร้างโปรเจกต์จริง
ประเด็นสำคัญ:
dev,buildและpreviewมีในทั้งสองฝั่ง — ความจำมือถ่ายทอดได้ทันที- Vite plugin ของ Svelte รัน Svelte compiler และตรวจ TypeScript พร้อมกันผ่าน
svelte-checkจึงไม่ต้องมี prefixtsc &&แยกต่างหาก - SvelteKit เพิ่ม script
check(svelte-kit sync && svelte-check) และ scripttestที่เป็น optional เพิ่มมาจาก basics นี้
โครงสร้างโปรเจกต์
หัวข้อที่มีชื่อว่า “โครงสร้างโปรเจกต์”ทั้ง Vite+Svelte SPA และ SvelteKit ต่างเป็น thin wrapper รอบ pattern ที่คุ้นเคย:
Vite + Svelte SPA (เทียบเท่ากับ Vite + React):
flowchart TB root(["project root"]) root --> src["src/"] src --> main["main.ts — entry point (was main.tsx)"] src --> app["App.svelte — root component (was App.tsx)"] src --> lib["lib/ — shared components and utilities"] root --> indexHtml["index.html"] root --> viteConfig["vite.config.ts"]
SvelteKit (เทียบเท่ากับ Next.js):
flowchart TB root(["project root"]) root --> src["src/"] src --> routes["routes/ — file-based routing (was app/ or pages/ in Next.js)"] routes --> page["+page.svelte — a route's UI"] routes --> layout["+layout.svelte — shared layout wrapper"] src --> lib["lib/ — shared utilities and components"] root --> staticDir["static/ — public assets (was public/)"] root --> svelteConfig["svelte.config.js"] root --> viteConfig["vite.config.ts"]
mental model แมปได้ชัดเจน: src/routes/ ใน SvelteKit ทำหน้าที่เหมือน app/ (หรือ pages/) ใน Next.js naming convention +page.svelte เป็นของ SvelteKit เฉพาะ — prefix + บอกให้รู้ว่าเป็น framework file ไม่ใช่ helper file ของคุณเอง
vite.config.ts — เปลี่ยนแค่ plugin
หัวข้อที่มีชื่อว่า “vite.config.ts — เปลี่ยนแค่ plugin”React และ Svelte ต่างตั้งค่า Vite ด้วย single plugin import:
// Reactimport react from '@vitejs/plugin-react';export default { plugins: [react()] };
// Svelteimport { svelte } from '@sveltejs/vite-plugin-svelte';export default { plugins: [svelte()] };ส่วนอื่นทั้งหมด ไม่ว่าจะเป็น aliases, server options, build targets — เป็น Vite config เหมือนกันทุกอย่าง