2.4 KiB
2.4 KiB
프레임워크 / 라이브러리 사용 규칙
Vue 3 / Nuxt
컴포넌트 작성
<script setup lang="ts">사용을 기본으로 합니다. Options API는 신규 코드에서 사용하지 않습니다.- 컴포넌트는 단일 책임 원칙을 지키며, 200줄을 넘으면 분리를 검토합니다.
- Props는
defineProps<T>()제네릭 형태로 타입을 명시합니다. - Emits는
defineEmits<{ ... }>()제네릭 형태로 선언합니다. refvsreactive: 원시값과 단일 객체는ref, 복잡한 상태 트리는reactive를 고려합니다. 일관성을 위해 팀 내에서 가능한ref를 우선합니다.
상태 관리
- 컴포넌트 내 로컬 상태:
ref/reactive - 여러 컴포넌트가 공유하는 상태: Pinia 사용
- 서버 상태: Nuxt
useFetch/useAsyncData사용, 직접fetch호출은 지양합니다.
라우팅
- Nuxt의 파일 기반 라우팅을 사용합니다. 수동 라우트 정의는 특수한 경우에만 허용됩니다.
- 동적 라우트 파라미터는
[param].vue형식을 사용합니다.
Composable
- 재사용 가능한 로직은
composables/디렉토리의useXxx함수로 추출합니다. - Composable은 부수효과를 최소화하고, 반환 객체에 상태와 메서드를 함께 묶어 반환합니다.
TypeScript
strict: true를 유지합니다.- 공용 타입은
types/또는 각 도메인의types.ts에 모아둡니다. - 외부 API 응답은 반드시 타입을 정의하여 사용합니다.
Tailwind CSS
- 유틸리티 클래스 우선 사용. 공통 패턴은 컴포넌트로 추출합니다.
@apply는 꼭 필요한 경우에만 사용하고, 가능한 유틸리티를 직접 나열합니다.- 임의값 클래스(
w-[123px])는 디자인 시스템에 등록되지 않은 값에만 제한적으로 사용합니다. - 조건부 클래스는
clsx또는cn유틸리티를 사용하여 가독성을 확보합니다. - 클래스 순서는 Tailwind 공식 프리셋(
prettier-plugin-tailwindcss)을 따릅니다.
외부 라이브러리 도입
- 새로운 라이브러리를 추가할 때는 PR 설명에 도입 이유, 번들 영향, 대안 검토 내용을 기록합니다.
- 동일 기능의 라이브러리를 중복 도입하지 않습니다.
- 유지보수가 중단된 패키지(6개월 이상 업데이트 없음)는 도입하지 않습니다.