React + Vite + TypeScript + Tailwind CSS + Zustandλ₯Ό μ¬μ©νλ ν΄λΌμ΄μΈνΈ μ ν리μΌμ΄μ μ λλ€.
npm installnpm run devnpm run buildnpm run preview- React 18 - UI λΌμ΄λΈλ¬λ¦¬ (μμ μ μΈ 18 λ²μ μ¬μ©)
- Vite - λΉλ λꡬ λ° κ°λ° μλ²
- TypeScript - νμ μμ μ±
- Tailwind CSS - μ νΈλ¦¬ν° μ°μ CSS νλ μμν¬
- Zustand - μν κ΄λ¦¬ λΌμ΄λΈλ¬λ¦¬
- FSD - Feature-Sliced Design μν€ν μ²
- ESLint - μ½λ λ¦°ν
- Prettier - μ½λ ν¬λ§·ν
- Path Alias -
@/κ²½λ‘λ‘ import
alter-client/
βββ src/
β βββ app/ # μ± μ΄κΈ°ν λ° μ€μ
β β βββ providers/ # μ μ providers
β β βββ styles/ # κΈλ‘λ² μ€νμΌ
β β βββ App.tsx # λ£¨νΈ μ± μ»΄ν¬λνΈ
β β βββ main.tsx # μ§μ
μ
β βββ pages/ # νμ΄μ§ μ»΄ν¬λνΈ
β β βββ home/ # ν νμ΄μ§
β βββ widgets/ # λ
립μ μΈ UI λΈλ‘
β βββ features/ # μ¬μ©μ μνΈμμ© κΈ°λ₯
β β βββ counter/ # μΉ΄μ΄ν° κΈ°λ₯
β β βββ ui/ # UI μ»΄ν¬λνΈ
β β βββ index.ts # Public API
β βββ entities/ # λΉμ¦λμ€ μν°ν°
β βββ shared/ # μ¬μ¬μ© κ°λ₯ν μ½λ
β βββ stores/ # Zustand μ€ν μ΄
β βββ ui/ # κ³΅ν΅ UI μ»΄ν¬λνΈ
β βββ lib/ # μ νΈλ¦¬ν° ν¨μ
βββ public/ # κ³΅κ° μ μ νμΌ
βββ tailwind.config.js # Tailwind CSS μ€μ
βββ postcss.config.js # PostCSS μ€μ
βββ vite.config.ts # Vite μ€μ (path alias ν¬ν¨)
βββ tsconfig.json # TypeScript μ€μ
βββ eslint.config.js # ESLint μ€μ
- app - μ± μ΄κΈ°ν, μ μ μ€μ , providers
- pages - λΌμ°νΈλ³ νμ΄μ§ μ»΄ν¬λνΈ
- widgets - 볡ν©μ μΈ UI λΈλ‘ (μ¬λ¬ features μ‘°ν©)
- features - μ¬μ©μ μνΈμμ© κΈ°λ₯ (λΉμ¦λμ€ λ‘μ§ ν¬ν¨)
- entities - λΉμ¦λμ€ μν°ν° (μ¬μ©μ, μν λ±)
- shared - μ¬μ¬μ© κ°λ₯ν μ½λ (UI, μ νΈ, μ€ν μ΄ λ±)
npm run dev- κ°λ° μλ² μμnpm run build- νλ‘λμ λΉλnpm run preview- λΉλ κ²°κ³Ό 미리보기npm run lint- ESLint κ²μ¬npm run lint:fix- ESLint μλ μμ npm run format- Prettier ν¬λ§·νnpm run format:check- Prettier κ²μ¬
Zustandλ₯Ό μ¬μ©ν κ°λ¨νκ³ κ°λ ₯ν μν κ΄λ¦¬μ λλ€.
import { useStore } from '@/shared/stores/useStore'
function MyComponent() {
const { count, increment, decrement } = useStore()
return (
<div>
<p>Count: {count}</p>
<button onClick={increment}>+</button>
<button onClick={decrement}>-</button>
</div>
)
}@/ κ²½λ‘λ₯Ό μ¬μ©νμ¬ src ν΄λλ₯Ό κΈ°μ€μΌλ‘ import ν μ μμ΅λλ€.
// β
Good
import { Counter } from '@/features/counter'
import { useStore } from '@/shared/stores/useStore'
import { HomePage } from '@/pages/home'
// β Bad
import { Counter } from '../../../features/counter'Tailwind CSSμ μ νΈλ¦¬ν° ν΄λμ€λ₯Ό μ¬μ©νμ¬ λΉ λ₯΄κ² μ€νμΌλ§ν μ μμ΅λλ€.
<div className="flex items-center justify-center min-h-screen bg-gray-100">
<h1 className="text-4xl font-bold text-blue-600">Hello World</h1>
</div>