travel-planning-app/
apps/
web/
src/
pages/
Home.tsx
package.json
admin/
...
packages/
ui/
src/
icons/ # SVG 원본 파일 (공통)
icons-generated/ # generate:icons로 생성된 React 컴포넌트 (공통)
button.tsx
card.tsx
index.ts # 모든 컴포넌트와 아이콘 export
package.json
pnpm-workspace.yaml
...
packages/ui/src/icons/
에 SVG로 관리icons-generated/
에 SVGR로 변환된 React 컴포넌트가 생성됨index.ts
에서 모든 아이콘과 UI 컴포넌트를 exportpackages/ui
에서 SVGR을 설치합니다.
cd packages/ui
pnpm add -D @svgr/cli
packages/ui/package.json
{
"scripts": {
"generate:icons": "svgr --typescript --icon --out-dir src/icons-generated src/icons"
}
}
packages/ui/src/icons/Search.svg
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg">
<circle cx="11" cy="11" r="8"/>
<line x1="21" y1="21" x2="16.65" y2="16.65"/>
</svg>
packages/ui/src/icons/User.svg
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg">
<circle cx="12" cy="7" r="4"/>
<path d="M5.5 21a10 10 0 0 1 13 0"/>
</svg>
터미널에서 아래 명령어 실행
pnpm run generate:icons
결과:
packages/ui/src/icons-generated/Search.tsx
, User.tsx
등 생성
packages/ui/src/index.ts
// UI 컴포넌트 export
export * from "./button";
export * from "./card";
// 아이콘 export
export { default as SearchIcon } from "./icons-generated/Search";
export { default as UserIcon } from "./icons-generated/User";
// ...추가 아이콘도 동일하게 export
아이콘이 많다면 아래처럼 자동화도 가능합니다:
// packages/ui/src/icons-generated/index.ts export { default as SearchIcon } from "./Search"; export { default as UserIcon } from "./User"; // ...자동 생성 스크립트로 관리 가능
그리고
index.ts
에서export * from "./icons-generated";
apps/web/src/pages/Home.tsx
import React from "react";
import { Button, Card, SearchIcon, UserIcon } from "@myorg/ui";
const Home: React.FC = () => (
<Card>
<Button leftIcon={<SearchIcon width={16} height={16} />}>
검색
</Button>
<UserIcon width={24} height={24} color="#666" />
</Card>
);
export default Home;
packages/ui/tsconfig.json
{
"compilerOptions": {
"declaration": true,
"declarationDir": "dist",
"outDir": "dist",
"esModuleInterop": true,
"jsx": "react-jsx",
"module": "ESNext",
"moduleResolution": "Node",
"target": "ESNext",
"strict": true,
"skipLibCheck": true
},
"include": ["src"]
}
앱의 tsconfig.json에서
@myorg/ui
가 node_modules 또는 패키지 경로에서 resolve되도록 설정
packages/ui/package.json
에 아래처럼 추가하면, 빌드 전에 항상 최신 아이콘 컴포넌트가 생성됩니다.{
"scripts": {
"prebuild": "pnpm run generate:icons",
"build": "tsc"
}
}
@myorg/ui
에서만 관리/생성