Skip to content

Latest commit

Β 

History

History
142 lines (110 loc) Β· 4.2 KB

File metadata and controls

142 lines (110 loc) Β· 4.2 KB

Alter Client

React + Vite + TypeScript + Tailwind CSS + Zustandλ₯Ό μ‚¬μš©ν•˜λŠ” ν΄λΌμ΄μ–ΈνŠΈ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μž…λ‹ˆλ‹€.

πŸš€ μ‹œμž‘ν•˜κΈ°

μ„€μΉ˜

npm install

개발 μ„œλ²„ μ‹€ν–‰

npm run dev

λΉŒλ“œ

npm run build

미리보기

npm run preview

πŸ› οΈ 기술 μŠ€νƒ

  • React 18 - UI 라이브러리 (μ•ˆμ •μ μΈ 18 버전 μ‚¬μš©)
  • Vite - λΉŒλ“œ 도ꡬ 및 개발 μ„œλ²„
  • TypeScript - νƒ€μž… μ•ˆμ •μ„±
  • Tailwind CSS - μœ ν‹Έλ¦¬ν‹° μš°μ„  CSS ν”„λ ˆμž„μ›Œν¬
  • Zustand - μƒνƒœ 관리 라이브러리
  • FSD - Feature-Sliced Design μ•„ν‚€ν…μ²˜
  • ESLint - μ½”λ“œ λ¦°νŒ…
  • Prettier - μ½”λ“œ ν¬λ§·νŒ…
  • Path Alias - @/ 경둜둜 import

πŸ“ ν”„λ‘œμ νŠΈ ꡬ쑰 (FSD - Feature-Sliced Design)

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 μ„€μ •

FSD λ ˆμ΄μ–΄ μ„€λͺ…

  • 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)

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>
  )
}

πŸ“¦ Path Alias

@/ 경둜λ₯Ό μ‚¬μš©ν•˜μ—¬ 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)

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>

πŸ“š μΆ”κ°€ λ¦¬μ†ŒμŠ€