1οΈβ£ SvelteKitμ΄λ?
SvelteKitμ Svelteλ₯Ό κΈ°λ°μΌλ‘ ν μ°¨μΈλ μΉ μ ν리μΌμ΄μ
νλ μμν¬μ
λλ€.
Reactμ Next.js, Vueμ Nuxt.jsμ²λΌ SSR(μλ²μ¬μ΄λ λ λλ§), SSG(μ μ μ¬μ΄νΈ μμ±), SPA(Single Page App), API λΌμ°ν
, λμ νμ΄μ§λ₯Ό μ§μν©λλ€.
π§ νΉμ§ μμ½
κΈ°λ₯ | μ€λͺ |
---|---|
β μλ² μ¬μ΄λ λ λλ§(SSR) | κ²μ μμ§ μΉνμ μΈ μ± μ μ κ°λ₯ |
β μ μ μ¬μ΄νΈ μμ±(SSG) | λΉ λ₯΄κ³ μμ ν μ μ λ°°ν¬ μ§μ |
β νμΌ κΈ°λ° λΌμ°ν | λλ ν 리 κ΅¬μ‘°λ‘ URL μλ μμ± |
β API λΌμ°νΈ λ΄μ₯ | λ°±μλ μμ΄λ μλ² ν¨μ ꡬν κ°λ₯ |
β λΉ λ₯Έ λ²λ€λ§ | Vite κΈ°λ° μ΄κ³ μ κ°λ° μλ² μ¬μ© |
2οΈβ£ κ°λ° νκ²½ μΈν
π Node.js μ€μΉ
- λ²μ : 18 μ΄μ
- 곡μ μ¬μ΄νΈμμ μ€μΉ (LTS κΆμ₯)
π¦ SvelteKit νλ‘μ νΈ μμ±
npx sv create my-app
cd my-app
npm install
npm run dev
npm run dev
λͺ λ ΉμΌλ‘ κ°λ° μλ² μ€νhttp://localhost:5173
μμ μ± νμΈ
νλ‘μ νΈ ν νλ¦Ώ μ ν μ
Skeleton Project
(κΈ°λ³Έ ν νλ¦Ώ)Demo App
(μμ ν¬ν¨, ꡬ쑰 νμ μ λμ λ¨)
3οΈβ£ λλ ν 리 ꡬ쑰 μ΄ν΄
my-app/
βββ src/
β βββ routes/ # νμ΄μ§ λΌμ°ν
β β βββ +page.svelte # "/" λ©μΈ νμ΄μ§
β β βββ about/+page.svelte
β βββ lib/ # κ³΅ν΅ μ»΄ν¬λνΈ λ° μ νΈ
β βββ app.html # HTML ν
νλ¦Ώ
βββ static/ # μ μ νμΌ (favicon, μ΄λ―Έμ§ λ±)
βββ svelte.config.js # μ€μ νμΌ
πΈ
routes/
ν΄λκ° λΌμ°ν μ μ€μ¬μ λλ€.
πΈ+page.svelte
,+page.ts
,+server.ts
,+layout.svelte
λ±μΌλ‘ ꡬμ±λ©λλ€.
4οΈβ£ νμ΄μ§ λΌμ°ν
SvelteKitμ νμΌκ³Ό ν΄λ μ΄λ¦λ§μΌλ‘ URL κ²½λ‘λ₯Ό μλμΌλ‘ λ§€νν©λλ€.
νμΌ κ΅¬μ‘° | λΈλΌμ°μ κ²½λ‘ |
---|---|
/routes/+page.svelte | / |
/routes/about/+page.svelte | /about |
/routes/blog/[slug]/+page.svelte | /blog/hello-world |
π§ͺ μμ
src/routes/about/+page.svelte
<script>
let name = 'SvelteKit';
</script>
<h1>About {name}</h1>
5οΈβ£ λ°μ΄ν° λ‘λ©
SvelteKitμ μλ²μμ λ°μ΄ν°λ₯Ό λ¨Όμ λΆλ¬μ νμ΄μ§μ μ λ¬ν μ μμ΅λλ€.
π§Ύ μμ : load
ν¨μ μ¬μ©
// src/routes/+page.ts
export function load() {
return {
name: 'Yeongjin',
age: 30
};
}
<script>
export let data;
</script>
<h1>{data.name} λμ λμ΄λ {data.age}μΈμ
λλ€</h1>
load()
ν¨μλ SSR, CSR νκ²½ λͺ¨λμμ λμν©λλ€.
6οΈβ£ API λΌμ°νΈ λ§λ€κΈ°
λ°±μλ μμ΄λ REST APIλ₯Ό SvelteKitμΌλ‘ ꡬνν μ μμ΄μ.
// src/routes/api/hello/+server.ts
export function GET() {
return new Response('μλ
νμΈμ, μ§μ΄μ
λλ€!');
}
/api/hello
κ²½λ‘λ‘ GET μμ² β μ μλ΅μ λ°ν- JSON μλ΅λ κ°λ₯:
return json({ message: "Hi" })
7οΈβ£ νΌ μ²λ¦¬: Actions
μλ²μμ νΌμ μ²λ¦¬νλ κΈ°λ₯λ λ§€μ° κ°νΈν©λλ€.
<!-- src/routes/contact/+page.svelte -->
<form method="POST">
<input name="message" />
<button type="submit">보λ΄κΈ°</button>
</form>
// src/routes/contact/+page.server.ts
export const actions = {
default: async ({ request }) => {
const formData = await request.formData();
const message = formData.get('message');
console.log('μ¬μ©μ λ©μμ§:', message);
return { success: true };
}
};
8οΈβ£ μ€νμΌλ§
κΈ°λ³Έ CSS κ°λ₯
<style>
h1 {
color: red;
}
</style>
Tailwind CSS μ°λ (λ§μ΄ μ)
npm install -D tailwindcss postcss autoprefixer
npx tailwindcss init tailwind.config.cjs -p
tailwind.config.cjs
:
content: ["./src/**/*.{html,js,svelte,ts}"],
src/app.css
:
@tailwind base;
@tailwind components;
@tailwind utilities;
svelte.config.js
μ μΆκ°:
preprocess: [
import('svelte-preprocess')({ postcss: true })
],
9οΈβ£ λΉλμ λ°°ν¬
μ μ μ¬μ΄νΈλ‘ λΉλ
npm run build
npm run preview
Node μλ²λ‘ μ€ν
npm run build
node build
Vercelμ λ°°ν¬
npm i -g vercel
vercel
π μΆμ² νμ΅ μλ£
- π 곡μ νν 리μΌ: https://learn.svelte.dev
- π SvelteKit λ¬Έμ: https://kit.svelte.dev/docs
- πΊ μ νλΈ:
The Net Ninja
μ SvelteKit κ°μ’ - π§ͺ μ€μ΅ μμ : Todo μ±, λΈλ‘κ·Έ, ν¬νΈν΄λ¦¬μ€ λ±
π μΆκ° ν
ν | μ€λͺ |
---|---|
π hot reload | κ°λ° μ€ μλ λ°μ |
π DevTools | Svelte for Chrome μ€μΉ μΆμ² |
π ꡬ쑰ν | /lib/components , /lib/stores λ± ν΄λλ‘ μ»΄ν¬λνΈ κ΄λ¦¬ |
β λ§λ¬΄λ¦¬: μ΄λ€ μ± λ§λ€κ³ μΆμΌμ κ°μ?
SvelteKitμ μ λ§ μ§κ΄μ μ΄κ³ λΉ λ¦
λλ€.
κ°λ¨ν ν¬νΈν΄λ¦¬μ€ μ¬μ΄νΈλΆν° λΈλ‘κ·Έ, κ΄λ¦¬μ νμ΄μ§, μ±λ΄ μΈν°νμ΄μ€, AI κΈ°λ° νλ‘ νΈμλκΉμ§ λ§λ€ μ μμ΄μ.