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 ๊ธฐ๋ฐ ํ๋ก ํธ์๋๊น์ง ๋ง๋ค ์ ์์ด์.