๐ŸŒฟ SvelteKit์— Tailwind CSS ํ†ตํ•ฉํ•˜๊ธฐ: ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ์™„๋ฒฝ ๊ฐ€์ด๋“œ

SvelteKit ํ”„๋กœ์ ํŠธ์— Tailwind CSS๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฐ€์žฅ ๊น”๋”ํ•˜๊ณ  ๊ณต์‹์ ์ธ ๋ฐฉ๋ฒ•์„ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค. ์ตœ์‹  ๋ฌธ์„œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ •๋ฆฌํ–ˆ์œผ๋ฉฐ, ์‹ค์ œ ์ฝ”๋“œ์™€ ์„ค์ • ์˜ˆ์‹œ๋ฅผ ํฌํ•จํ–ˆ์Šต๋‹ˆ๋‹ค.


โœ… 01. SvelteKit ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ

SvelteKit ํ”„๋กœ์ ํŠธ๊ฐ€ ์•„์ง ์—†๋‹ค๋ฉด, ์•„๋ž˜ ๋ช…๋ น์–ด๋กœ ์ƒˆ๋กœ ๋งŒ๋“ค์–ด ์ฃผ์„ธ์š”.
๊ณต์‹ ๋ฌธ์„œ์—์„œ๋„ ์•ˆ๋‚ดํ•˜๋Š” ๊ฐ€์žฅ ํ‘œ์ค€์ ์ธ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค:

npx sv create my-project
cd my-project

โœ… 02. Tailwind CSS ์„ค์น˜

Tailwind CSS์™€ ๊ด€๋ จ๋œ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

npm install tailwindcss @tailwindcss/vite

โœ… 03. Vite ์„ค์ • ํŒŒ์ผ ์ˆ˜์ •

vite.config.ts ๋˜๋Š” vite.config.js์— Tailwind ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค:

import { sveltekit } from '@sveltejs/kit/vite';
import { defineConfig } from 'vite';
import tailwindcss from '@tailwindcss/vite';

export default defineConfig({
  plugins: [
    tailwindcss(),
    sveltekit(),
  ],
});

โœ… 04. Tailwind CSS import ํŒŒ์ผ ์ƒ์„ฑ

src/app.css ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ  ๋‹ค์Œ์„ ์ถ”๊ฐ€ํ•˜์„ธ์š”:

@import "tailwindcss";

์ด ํŒŒ์ผ์€ Tailwind์˜ ๊ธฐ๋ณธ ์Šคํƒ€์ผ, ์ปดํฌ๋„ŒํŠธ, ์œ ํ‹ธ๋ฆฌํ‹ฐ ํด๋ž˜์Šค๋ฅผ ํฌํ•จํ•˜๋Š” ํ•ต์‹ฌ ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.


โœ… 05. CSS๋ฅผ SvelteKit ๋ ˆ์ด์•„์›ƒ์— import

SvelteKit์€ ๊ธฐ๋ณธ์ ์œผ๋กœ src/routes/+layout.svelte์—์„œ ์ „์—ญ CSS๋ฅผ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.
ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ  ์•„๋ž˜์ฒ˜๋Ÿผ ์ž‘์„ฑํ•˜์„ธ์š”:

<script>
  import "../app.css";
</script>

<slot />

+layout.svelte๋Š” ๋ชจ๋“  ํŽ˜์ด์ง€์— ๊ณตํ†ต ์ ์šฉ๋˜๋Š” ์ „์—ญ UI ๋ฐ CSS๋ฅผ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค.


โœ… 06. ๊ฐœ๋ฐœ ์„œ๋ฒ„ ์‹คํ–‰

์„ค์ •์ด ๋๋‚ฌ๋‹ค๋ฉด, ๊ฐœ๋ฐœ ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•ด์„œ Tailwind๊ฐ€ ์ž˜ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค:

npm run dev

๋ธŒ๋ผ์šฐ์ €์—์„œ http://localhost:5173์„ ์—ด์–ด ํ™•์ธํ•˜์„ธ์š”.


โœ… 07. Tailwind CSS ์‚ฌ์šฉ ์‹œ์ž‘

์ด์ œ Tailwind ์œ ํ‹ธ๋ฆฌํ‹ฐ ํด๋ž˜์Šค๋ฅผ ๋งˆ์Œ๊ป ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

์˜ˆ: +page.svelte

<h1 class="text-3xl font-bold underline">
  Hello world!
</h1>

<style lang="postcss">
  @reference "tailwindcss";

  :global(html) {
    background-color: theme(--color-gray-100);
  }
</style>
  • class="text-3xl font-bold": Tailwind์˜ ํ…์ŠคํŠธ ํฌ๊ธฐ์™€ ๊ตต๊ธฐ ์„ค์ •
  • <style lang="postcss">: Tailwind์—์„œ ์Šคํƒ€์ผ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก PostCSS ์‚ฌ์šฉ
  • @reference์™€ theme() ํ•จ์ˆ˜: Tailwind ๋ณ€์ˆ˜ ์‚ฌ์šฉ

๐Ÿง  ๋งˆ๋ฌด๋ฆฌ ์ •๋ฆฌ

ํ•ญ๋ชฉ์„ค๋ช…
์„ค์ • ๋ฐฉ์‹๊ณต์‹ ๋ฌธ์„œ ๊ธฐ๋ฐ˜์˜ Vite ํ”Œ๋Ÿฌ๊ทธ์ธ ํ†ตํ•ฉ ๋ฐฉ์‹
์Šคํƒ€์ผ ์ ์šฉHTML ํด๋ž˜์Šค ๊ธฐ๋ฐ˜ ์œ ํ‹ธ๋ฆฌํ‹ฐ ๋ฐฉ์‹
ํ™•์žฅ์„ฑPostCSS, JIT ๋ชจ๋“œ, ํ…Œ๋งˆ ์ปค์Šคํ„ฐ๋งˆ์ด์ง• ๊ฐ€๋Šฅ
๊ธฐํƒ€๋ชจ๋“  ์„ค์ •์€ ์ปค์Šคํ„ฐ๋งˆ์ด์ง• ๊ฐ€๋Šฅ, ์„ค์ • ํŒŒ์ผ๋กœ ์กฐ์ • ๊ฐ€๋Šฅ

๐ŸŽ ๋‹ค์Œ ๊ธ€ ์˜ˆ๊ณ 

  • ๋‹คํฌ ๋ชจ๋“œ ๋ฐ ์‚ฌ์šฉ์ž ํ…Œ๋งˆ ์ ์šฉํ•˜๊ธฐ
  • daisyUI, Flowbite ๋“ฑ UI ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ถ”๊ฐ€ํ•˜๊ธฐ
  • SvelteKit + Tailwind๋กœ ํฌํŠธํด๋ฆฌ์˜ค ์‚ฌ์ดํŠธ ๋งŒ๋“ค๊ธฐ

์ƒ˜ํ”Œ ํ”„๋กœ์ ํŠธ zip ํŒŒ์ผ์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ๋งํฌ์—์„œ ๋‹ค์šด๋กœ๋“œํ•˜์‹ค ์ˆ˜ ์žˆ์–ด์š”:

์ด ํ”„๋กœ์ ํŠธ์—๋Š” ๋‹ค์Œ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค:

  • vite.config.js์—์„œ @tailwindcss/vite ํ”Œ๋Ÿฌ๊ทธ์ธ ์„ค์ •
  • src/app.css์— Tailwind import
  • +layout.svelte์—์„œ CSS ์ „์—ญ import
  • +page.svelte์— Tailwind ์œ ํ‹ธ๋ฆฌํ‹ฐ ํด๋ž˜์Šค ๋ฐ PostCSS ์˜ˆ์‹œ ํฌํ•จ


โšก Vite๋ž€?

Vite๋Š” ์ฐจ์„ธ๋Œ€ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ ๋นŒ๋“œ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.
Vue.js์˜ ์ฐฝ์‹œ์ž Evan You๊ฐ€ ๋งŒ๋“ค์—ˆ์œผ๋ฉฐ, ํ˜„์žฌ๋Š” React, Svelte, Preact ๋“ฑ ๋‹ค์–‘ํ•œ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ํญ๋„“๊ฒŒ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์–ด์š”.


๐Ÿ’ก ํ•œ ์ค„ ์š”์•ฝ

Vite๋Š” ๋น ๋ฅธ ๊ฐœ๋ฐœ ์„œ๋ฒ„์™€ ์ตœ์ ํ™”๋œ ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ชจ๋˜ ๋นŒ๋“œ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.


๐Ÿง  Vite์˜ ์ฃผ์š” ํŠน์ง•

ํŠน์ง•์„ค๋ช…
โšก ๋น ๋ฅธ ๊ฐœ๋ฐœ ์„œ๋ฒ„๋ชจ๋“ˆ ๋‹จ์œ„๋กœ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•ด์„œ ์ฆ‰์‹œ ๋ฐ˜์˜๋จ (Hot Module Replacement)
๐Ÿงฑ ๋ชจ๋“ˆ ๊ธฐ๋ฐ˜ES ๋ชจ๋“ˆ(ESM)์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ง์ ‘ ๋ชจ๋“ˆ ๋ถˆ๋Ÿฌ์˜ด
๐Ÿ› ๏ธ ๋นŒ๋“œ ๋„๊ตฌ ํ†ตํ•ฉRollup์„ ๋‚ด๋ถ€์ ์œผ๋กœ ์‚ฌ์šฉํ•ด์„œ ์ตœ์ ํ™”๋œ ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ ์ œ๊ณต
๐Ÿ”Œ ํ”Œ๋Ÿฌ๊ทธ์ธ ์‹œ์Šคํ…œ๋‹ค์–‘ํ•œ Vite ํ”Œ๋Ÿฌ๊ทธ์ธ๊ณผ ํ†ตํ•ฉ ๊ฐ€๋Šฅ (์˜ˆ: Tailwind, React, Svelte ๋“ฑ)
๐Ÿ“ฆ ๊ฒฝ๋Ÿ‰ ์„ค์ •vite.config.js ๋˜๋Š” vite.config.ts๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ์„ค์ • ๊ฐ€๋Šฅ

๐Ÿงช Vite์™€ SvelteKit์˜ ๊ด€๊ณ„

  • SvelteKit๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ Vite๋ฅผ ๋นŒ๋“œ ๋„๊ตฌ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑํ•œ vite.config.js๋Š” SvelteKit์˜ ๋™์ž‘ ๋ฐฉ์‹์ด๋‚˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•ํ•  ๋•Œ ์“ฐ์ž…๋‹ˆ๋‹ค.

์˜ˆ:

import { sveltekit } from '@sveltejs/kit/vite';
import tailwindcss from '@tailwindcss/vite';

export default defineConfig({
  plugins: [
    tailwindcss(),   // Tailwind ํ”Œ๋Ÿฌ๊ทธ์ธ ๋“ฑ๋ก
    sveltekit(),     // SvelteKit ์‚ฌ์šฉ ์„ ์–ธ
  ],
});

๐Ÿงฉ Vite๋กœ ๊ฐ€๋Šฅํ•œ ์ผ

์ž‘์—…๋ช…๋ น์–ด
๊ฐœ๋ฐœ ์„œ๋ฒ„ ์‹คํ–‰npm run dev
๋นŒ๋“œnpm run build
๋นŒ๋“œ ๊ฒฐ๊ณผ ๋ฏธ๋ฆฌ ๋ณด๊ธฐnpm run preview
ํ”Œ๋Ÿฌ๊ทธ์ธ ์ถ”๊ฐ€vite-plugin-xxx ํ˜•ํƒœ๋กœ ์„ค์น˜ ๊ฐ€๋Šฅ

๐Ÿ“ vite.config.js ์œ„์น˜์™€ ์—ญํ• 

  • ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ ๋””๋ ‰ํ† ๋ฆฌ์— ์กด์žฌ (vite.config.js ๋˜๋Š” vite.config.ts)
  • ์ฃผ์š” ์—ญํ• :
    • ํ”Œ๋Ÿฌ๊ทธ์ธ ์„ค์ •
    • ๋ณ„์นญ(alias) ์ •์˜
    • ๋นŒ๋“œ ๊ฒฝ๋กœ ์„ค์ •
    • ๊ฐœ๋ฐœ ์„œ๋ฒ„ ์˜ต์…˜ ์„ค์ •

โœ… ๋งˆ๋ฌด๋ฆฌ ์ •๋ฆฌ

ํ•ญ๋ชฉ์„ค๋ช…
Vite๋น ๋ฅธ ๊ฐœ๋ฐœ ์„œ๋ฒ„ + Rollup ๊ธฐ๋ฐ˜ ๋นŒ๋“œ ๋„๊ตฌ
SvelteKit๋‚ด๋ถ€์ ์œผ๋กœ Vite๋ฅผ ์‚ฌ์šฉํ•จ
Tailwind ํ†ตํ•ฉVite ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ํ†ตํ•ด ์‰ฝ๊ฒŒ ์„ค์ • ๊ฐ€๋Šฅ
์„ค์ • ํŒŒ์ผvite.config.js์—์„œ ํ”Œ๋Ÿฌ๊ทธ์ธ ๋ฐ ์„ค์ • ์กฐ์ •

๋‹ต๊ธ€ ๋‚จ๊ธฐ๊ธฐ

์ด๋ฉ”์ผ ์ฃผ์†Œ๋Š” ๊ณต๊ฐœ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•„์ˆ˜ ํ•„๋“œ๋Š” *๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค