Conversation
…t/SOS-47-package-ui-init
📦 번들 분석 결과📊 번들 크기 요약
🔍 주요 청크 파일 (크기순)🤖 자동 생성된 번들 분석 리포트 |
⚡ Lighthouse 성능 분석 결과📊 전체 평균 점수
📈 측정 현황
📄 페이지별 상세 분석🏠 커뮤니티 페이지:
|
| 지표 | 점수 |
|---|---|
| 🚀 Performance | 65점 |
| ♿ Accessibility | 80점 |
| ✅ Best Practices | 100점 |
| 🔍 SEO | 100점 |
📊 상세 분석 보기
👥 창업자 페이지: /main/founder
| 지표 | 점수 |
|---|---|
| 🚀 Performance | 75점 |
| ♿ Accessibility | 87점 |
| ✅ Best Practices | 100점 |
| 🔍 SEO | 100점 |
📊 상세 분석 보기
🏡 홈 페이지: /main/home
| 지표 | 점수 |
|---|---|
| 🚀 Performance | 75점 |
| ♿ Accessibility | 91점 |
| ✅ Best Practices | 100점 |
| 🔍 SEO | 100점 |
📊 상세 분석 보기
🗺️ 지도 페이지: /main/maps
| 지표 | 점수 |
|---|---|
| 🚀 Performance | 75점 |
| ♿ Accessibility | 87점 |
| ✅ Best Practices | 100점 |
| 🔍 SEO | 100점 |
📊 상세 분석 보기
👤 프로필 페이지: /main/profile
| 지표 | 점수 |
|---|---|
| 🚀 Performance | 75점 |
| ♿ Accessibility | 88점 |
| ✅ Best Practices | 100점 |
| 🔍 SEO | 100점 |
📊 상세 분석 보기
🔗 전체 상세 분석 결과
📄 측정된 페이지
- /main/community
- /main/founder
- /main/home
- /main/maps
- /main/profile
모든 페이지에서 성능 측정이 완료되었습니다.
🤖 자동 생성된 Lighthouse 성능 리포트
There was a problem hiding this comment.
Pull request overview
이 PR은 @soso/ui 패키지의 초기 설정과 Button 컴포넌트를 추가하는 작업입니다. tsup 빌드 시스템, Vitest 테스트 환경, 그리고 프로덕션급 React 컴포넌트 라이브러리를 위한 기본 인프라를 구축했습니다.
주요 변경사항:
@soso/ui패키지 설정: ESM/CJS 이중 지원, TypeScript 타입 선언, npm 배포 준비- tsup 빌드 시스템 구축: esbuild 기반 초고속 빌드, tree-shaking 지원
- Vitest 테스트 환경: React Testing Library 통합, 19개 단위 테스트 작성
- Button 컴포넌트 구현: variant, size, loading 상태 지원, 접근성 고려
- 패키지 매니저 버전 업그레이드 및 설정 조정
Reviewed changes
Copilot reviewed 24 out of 25 changed files in this pull request and generated 4 comments.
Show a summary per file
| File | Description |
|---|---|
| packages/ui/package.json | UI 패키지 메타데이터, exports 설정, 의존성 정의 |
| packages/ui/tsconfig.json | TypeScript 컴파일러 설정, path alias 및 타입 정의 |
| packages/ui/tsup.config.ts | tsup 빌드 설정 (ESM/CJS/DTS 생성) |
| packages/ui/vitest.config.ts | Vitest 테스트 환경 설정 (jsdom, coverage) |
| packages/ui/src/components/Button/Button.tsx | Button 컴포넌트 구현 (variant, size, loading 지원) |
| packages/ui/src/components/Button/Button.test.tsx | Button 컴포넌트 단위 테스트 (19개 테스트) |
| packages/ui/src/components/Pressable/Pressable.tsx | Press 애니메이션 래퍼 컴포넌트 |
| packages/ui/src/hooks/useTap.ts | 포인터 이벤트 처리 훅 |
| packages/ui/src/hooks/useLoadingDelay.ts | 로딩 지연 처리 훅 |
| packages/ui/src/utils/cn.ts | Tailwind className 병합 유틸리티 |
| packages/ui/src/constants/animation.ts | 애니메이션 토큰 정의 |
| packages/ui/src/test/setup.ts | Vitest 전역 설정 (jest-dom matchers) |
| packages/ui/src/index.ts | 패키지 메인 export 파일 |
| packages/ui/.npmignore | npm 배포 제외 파일 설정 |
| packages/ui/.eslintrc.cjs | ESLint 설정 (라이브러리용) |
| packages/ui/README.md | 패키지 문서화 |
| packages/eslint-config/library.cjs | 라이브러리 전용 ESLint 규칙 추가 |
| package.json | 패키지 매니저 버전 업데이트, engines 설정, overrides 추가 |
| .npmrc | pnpm 버전 업데이트 |
| apps/web/package.json | @types/node 버전 업데이트 |
| apps/web/.eslintrc.cjs | ESLint 설정 단순화 |
| "./components/*": { | ||
| "import": { | ||
| "types": "./dist/components/*.d.mts", | ||
| "default": "./dist/components/*.mjs" | ||
| }, | ||
| "require": { | ||
| "types": "./dist/components/*.d.ts", | ||
| "default": "./dist/components/*.js" | ||
| } | ||
| } |
There was a problem hiding this comment.
subpath exports 패턴 ./components/*가 설정되어 있으나, tsup 빌드 설정(tsup.config.ts)에서는 entry: ['src/index.ts']만 지정되어 있어 개별 컴포넌트 파일이 생성되지 않습니다.
현재 빌드로는 dist/components/ 디렉토리가 생성되지 않아 이 export가 작동하지 않습니다.
해결 방법:
- tsup.config.ts의 entry에 개별 컴포넌트를 추가하거나
- 이 subpath export를 제거하거나
- 번들러가 tree-shaking을 처리하도록 메인 export만 사용하시기 바랍니다.
| "./components/*": { | |
| "import": { | |
| "types": "./dist/components/*.d.mts", | |
| "default": "./dist/components/*.mjs" | |
| }, | |
| "require": { | |
| "types": "./dist/components/*.d.ts", | |
| "default": "./dist/components/*.js" | |
| } | |
| } |
| "@lhci/cli": "^0.15.1", | ||
| "eslint": "^8.56.0", |
There was a problem hiding this comment.
eslint가 devDependencies 목록의 중간에 추가되어 있어 알파벳 순서가 깨졌습니다. 일관성을 위해 @eslint/eslintrc 다음에 위치시키시기 바랍니다.
| "@lhci/cli": "^0.15.1", | |
| "eslint": "^8.56.0", | |
| "eslint": "^8.56.0", | |
| "@lhci/cli": "^0.15.1", |
| delayMs: 200, | ||
| }); | ||
|
|
||
| const isDisabled = disabled; |
There was a problem hiding this comment.
[nitpick] isDisabled 변수가 단순히 disabled를 할당받고 있어 불필요해 보입니다. disabled를 직접 사용하는 것이 더 명확합니다.
만약 향후 isLoading 상태도 포함한 복합 조건이 필요하다면 주석으로 의도를 명시하는 것을 권장합니다.
| }); | ||
|
|
||
| return () => timers.forEach((timer) => clearTimeout(timer)); | ||
| }, [isLoading, delayMs]); |
There was a problem hiding this comment.
useEffect의 의존성 배열에 delayMs가 포함되어 있는데, 이 값이 배열일 경우 매 렌더링마다 새로운 참조가 생성되어 effect가 불필요하게 재실행될 수 있습니다.
해결 방법:
delayMs를useMemo로 감싸거나- 의존성 배열에서
JSON.stringify(delayMs)를 사용하거나 - 또는 ESLint 규칙을 무시하고 안정적인 값만 의존성에 포함시키도록 문서화하시기 바랍니다.
| }, [isLoading, delayMs]); | |
| }, [isLoading, JSON.stringify(delayMs)]); |
youdaeng2
left a comment
There was a problem hiding this comment.
공통 UI 패키지 구조랑 tsup/vitest 세팅까지 한 번에 잡아주셔서 감사합니다.
처음 접하는 내용이 많아서 완전히 이해했다고 할 순 없지만.. 전체적인 흐름은 파악할 수 있었습니다!
이전에 말씀해주신 것처럼 나중에는 web 쪽에서도 @soso/ui의 Button을 import해서 사용하는 방향으로 가져가실 예정이신 걸까요?
고생하셨습니다!!!
📌 개요
UI 패키지 기본 설정 및 빌드 시스템 구축
@soso/ui패키지 설정 (exports, peerDependencies)🗒 상세 설명
1.
@soso/ui패키지 설정프로덕션급 React 컴포넌트 라이브러리를 위한 package.json을 구성했습니다.
핵심 기술 및 구현사항
Modern Package Exports: ESM/CJS 동시 지원
exports필드로 조건부 export 설정Peer Dependencies 관리:
npm 배포 설정:
publishConfig.access: "public"- 공개 패키지files필드로 배포 파일 제한 (dist, README, CHANGELOG만)사용 예시
2. tsup 빌드 시스템 구축
esbuild 기반의 초고속 번들러 tsup을 활용한 빌드 시스템을 구축했습니다.
핵심 기술 및 구현사항
Multi-Format 빌드:
최적화 기능:
빌드 속도:
빌드 산출물
사용 예시
3. Vitest 단위 테스트 환경 구축
Vite 기반의 초고속 테스트 프레임워크 Vitest를 도입했습니다.
핵심 기술 및 구현사항
Testing Library 통합:
jsdom 환경:
Coverage 설정:
Global Test APIs:
사용 예시
4. Button 컴포넌트 추가
SOSO web의 실제 Button 컴포넌트를
packages/ui로 마이그레이션했습니다.테스트를 위해 기존
apps/web에도 존재합니다.마이그레이션된 파일
5. 테스트 전략 및 구현
📊 테스트 전략: Vitest vs Storybook 역할 분담
프로덕션급 컴포넌트 테스트를 위해 각 도구의 강점에 맞는 역할을 명확히 분리했습니다.
✅ Vitest 테스트 (19개) - 로직 검증
현재 구현 완료
총 19개의 단위 테스트로 Button의 모든 로직을 검증했습니다.
테스트 항목:
기본 렌더링 (4개)
인터랙션 (2개)
Props 검증 (4개)
상태 (5개)
스타일 (1개)
접근성 (3개)
제외한 테스트 (Storybook으로 이관):
스크린샷
실제 push시 CI로 테스트 코드가 검증되는 모습
🔗 이슈
closes #89
SOS-47: UI 패키지 기본 설정 및 빌드 시스템 구축
✅ 체크리스트
🧪 테스트 방법
변경 사항을 다음 방법으로 검증했습니다:
1. 의존성 설치
2. 빌드 검증
cd packages/ui pnpm build3. 빌드 산출물 확인
4. 테스트 실행
5. TypeScript 타입 체크
6. 패키지 exports 확인
node -e "console.log(require('./packages/ui/package.json').exports)"기술적 결정 사항
1. tsup 선택 이유
2. Vitest 선택 이유
3. exports 필드 설계
후속 작업
이어서 진행할 작업 계획:
Issue 1.3: Storybook 개발 환경 구축 (예정)
apps/storybook/Storybook 8 앱 생성@soso/ui통합