เทมเพลต SvelteKit สำหรับงานโปรดักชันที่จัดชุดเครื่องมือมาให้พร้อม: routing, auth, API proxy, OpenAPI client, i18n, UI component kit และ developer experience ครบถ้วน สามารถโคลนแล้วเริ่มสร้างฟีเจอร์ได้ทันที
bun install.env ใส่ PUBLIC_APP_TITLE และ BACKEND_API_URLbun run dev/openapi.json, /v1/auth/login, และ /v1/auth/refresh หากต้องการใช้ proxy + OpenAPI client เต็มรูปแบบbun install
สร้างไฟล์ .env (หรือกำหนดค่าในระบบ) อย่างน้อยดังนี้
PUBLIC_APP_TITLE=Sveltekitten
BACKEND_API_URL=http://localhost:8000
bun run dev
หรือ build + preview โปรดักชัน
bun run build
bun run preview
bun run check
bun run lint
bun run format
bun run openapi:fastapi
สคริปต์นี้ดึง schema จาก ${BACKEND_API_URL}/openapi.json
@tailwindcss/vite, ไม่มี config แยก เสริมด้วย component kit ใน src/lib/components/uiopenapi-fetch และ type generation จาก openapi-typescriptsrc/app.html, src/app.css จัดโครงสร้างและ global stylessrc/hooks.server.ts รวม middleware ด้วย sequence (auth guard, paraglide, fastapi client)src/lib/ เก็บ API clients, UI components, hooks, schemas, utilitiessrc/routes/ ใช้ file-based routing ของ SvelteKit (มีกลุ่ม (auth) สำหรับหน้าที่ต้องล็อกอิน)static/ สำหรับไฟล์สาธารณะ เช่น robots.txt(auth) หากไม่มีหรือหมดอายุ refresh token จะ redirect ไป /loginsrc/routes/api/proxy/[...slug]/+server.ts) รับทุกคำขอใต้ /api/proxy/**Authorization: Bearer <access_token> จากคุกกี้ให้อัตโนมัติ/v1/auth/refresh เพื่อขอ access token ใหม่แล้วรีทรีไลน์เดิมsrc/routes/login) ใช้ Superforms + Zod ทำงานฝั่งเซิร์ฟเวอร์ เซ็ตคุกกี้ access_token, refresh_token และ redirect เข้าหน้า (auth)src/lib/api/fastapi-client.tsevent.locals.fastapiClient ใน load/action ของ serverconst response = await locals.fastapiClient.POST('/v1/auth/login', {
body: { email, password }
});
src/lib/api/api.ts สร้าง client กำหนด baseUrl เองpokemon-api.ts เรียก PokeAPI สำหรับ demosuperforms + zodsrc/lib/schemas/auth.schema.tsmessages/project.inlang/paraglideVitePlugin จะ generate โค้ดลง src/lib/paraglide/messages/ แล้วรัน dev/build อีกรอบsrc/lib/components/ui/ เช่น button, card, dropdown menu, form controlssonner) ถูกเพิ่มไว้ใน src/routes/+layout.sveltesrc/lib/logger.ts ใช้ pino ตั้งค่าแยก dev/prod อัตโนมัติimport { logger } from '$lib/logger';
logger.info({ userId }, 'Fetching profile');
try {
// ...do work
} catch (error) {
logger.error(error, 'Failed to fetch profile');
}
// ฟังก์ชันเสริมสำหรับดีบักใน dev mode เท่านั้น
logger.inspect(data);
logger.dir({ event });
logger.table(rows);
inspect, dir, table จะ log เฉพาะเวลา dev === true เพื่อไม่ให้รบกวนโปรดักชันpino API ภายใน createLogger()PUBLIC_APP_TITLE ชื่อแอปฝั่ง client (โหลดผ่าน $env/dynamic/public)BACKEND_API_URL URL ของ backend สำหรับ proxy และ OpenAPI ($env/dynamic/private)set -x PUBLIC_APP_TITLE "Sveltekitten"
set -x BACKEND_API_URL "http://localhost:8000"
bun run dev เริ่มโหมดพัฒนาbun run build สร้างโปรดักชันbun run preview เปิดเซิร์ฟเวอร์โปรดักชันแบบโลคอลbun run check ตรวจ type + lint ของ Sveltebun run lint รัน prettier --check และ eslintbun run format ใช้ prettier --writebun run openapi และ bun run openapi:fastapi สร้าง type จาก OpenAPI schema@sveltejs/adapter-node ได้ไฟล์ Node server ภายหลัง bun run buildbun run preview หรือ node build (ตาม script ที่คุณตั้ง)BACKEND_API_URL/v1/auth/refresh ทำงานหรือไม่/api/proxy/** เพื่อลดปัญหา CORS ฝั่งเบราว์เซอร์bun run openapi:fastapi หลัง backend เปลี่ยน schemaaccess_token และ refresh_token ให้สอดคล้องกับ helper ใน src/lib/utilssrc/
app.css
app.html
hooks.server.ts
lib/
api/
api.ts
fastapi-client.ts
paths/fastapi.d.ts
components/ui/
button/
card/
dropdown-menu/
form/
hooks/
auth-guard.ts
fastapi.hook.ts
schemas/
auth.schema.ts
utils/
api-core.ts
auth.ts
cookies.ts
routes/
+layout.svelte
+layout.ts
+page.svelte
(auth)/home/+page.svelte
api/proxy/[...slug]/+server.ts
login/
+page.svelte
+page.server.ts
login-form.svelte
พร้อมใช้งานแล้ว! หากมีข้อเสนอแนะหรืออยากเพิ่มตัวอย่าง สามารถเปิด issue หรือ pull request ใน repository ได้เลย