用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/puk0806/gugbab-claude --skill tsup命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
DDD(Domain-Driven Design) 아키텍처 핵심 패턴 - 유비쿼터스 언어, 서브도메인, 바운디드 컨텍스트, Aggregate, Entity/VO, 도메인 서비스/이벤트, 레이어드 아키텍처
대규모 React/Next.js 프로젝트를 layer-first(types/·utils/·hooks/·api/·components/ 밑에 도메인이 반복되는 구조)에서 domain-first(feature/도메인 우선) 구조로 전환하는 설계 기준과 절차. Feature-Sliced Design 2.1 정본(layers 6종·slices·segments·import 규칙·@x 크로스임포트·public API), FSD를 쓰지 않는 경량 대안(features + shared 2~3계층 + ESLint import/no-restricted-paths), Next.js App Router 공존 전략(route group `()`·private folder `_`·colocation), Turborepo/Nx 모노레포에서 폴더↔패키지 승격 기준, colocation과 배럴 파일 성능 트레이드오프, 도메인 경계 역추출(import 그래프·change coupling·용어 클러스터), 전환 실패 패턴(shared 비대화·entities 남용·순환 의존·도메인=라우트 착각·조기 추상화). 도메인 개념 자체(바운디드 컨텍스트·유비쿼터스 언어)는 `architecture/ddd` 스킬을 참조한다.
소스 파일 수천 개 규모 프론트엔드 코드베이스를 멈추지 않고 점진 재구조화하는 실행 전략 - Strangler Fig / Branch by Abstraction / Parallel Change, ts-morph·jscodeshift codemod, PR 분할·검증 게이트·되돌리기, 테스트 없는 코드의 안전망, 작업 순서 설계와 위반 수 기반 진행 추적
基于 SOC 职业分类
正在显示 SKILL.md
| name | tsup |
| description | tsup 패키지 번들러 — esbuild 기반 TypeScript 라이브러리 빌드, CJS/ESM 동시 출력, DTS 생성, 모노레포 공유 패키지 빌드 패턴 |
소스: https://tsup.egoist.dev | https://github.com/egoist/tsup/releases 검증일: 2026-04-20
tsup은 esbuild 기반의 TypeScript/JavaScript 라이브러리 번들러다. 설정이 최소화되어 있고, CJS/ESM 동시 출력과 TypeScript declaration 파일 생성을 지원한다.
최신 안정 버전: 8.5.1 (2024-11-12 릴리즈)
적합한 경우:
부적합한 경우:
# npm
npm install tsup typescript --save-dev
# pnpm
pnpm add -D tsup typescript
import { defineConfig } from 'tsup';
export default defineConfig({
entry: ['src/index.ts'],
format: ['cjs', 'esm'],
dts: true,
clean: true,
sourcemap: true,
});
| 옵션 | 타입 | 설명 |
|---|---|---|
entry | string[] 또는 Record<string, string> | 엔트리 포인트 |
format | ('cjs' | 'esm' | 'iife')[] | 출력 포맷 |
dts | boolean | DtsConfig | TypeScript declaration 파일 생성 |
clean | boolean | 빌드 전 출력 디렉토리 정리 |
sourcemap | boolean | 소스맵 생성 |
splitting | boolean | 코드 스플리팅 (ESM에서만 유효) |
minify | boolean | 코드 압축 |
target | string | 빌드 타겟 (예: 'es2022', 'node18') |
outDir | string | 출력 디렉토리 (기본: 'dist') |
external | string[] | 번들에서 제외할 패키지 |
noExternal | string[] | 번들에 강제 포함할 패키지 |
treeshake | boolean | TreeshakingStrategy | Tree shaking 활성화 (Rollup 사용) |
onSuccess | string | (() => Promise<void>) | 빌드 성공 후 실행할 명령/함수 |
bundle | boolean | 번들링 여부 (기본: true) |
banner | { js?: string; css?: string } | 출력 파일 상단에 추가할 텍스트 |
define | Record<string, string> | 전역 상수 치환 |
esbuildPlugins |
export default defineConfig({
entry: ['src/index.ts'],
});
export default defineConfig({
entry: ['src/index.ts', 'src/cli.ts'],
});
export default defineConfig({
entry: {
index: 'src/index.ts',
cli: 'src/cli.ts',
utils: 'src/utils/index.ts',
},
});
export default defineConfig({
entry: ['src/**/*.ts'],
bundle: false, // 파일을 하나로 묶지 않고 각각 변환
});
export default defineConfig({
entry: ['src/index.ts'],
format: ['cjs', 'esm'],
dts: true,
});
출력 결과:
dist/
├── index.js # ESM
├── index.cjs # CJS
├── index.d.ts # ESM Declaration
└── index.d.cts # CJS Declaration
tsup 8.x에서 ESM은
.js, CJS는.cjs확장자가 기본이다.package.json의"type": "module"여부에 따라 달라질 수 있다. CJS 전용.d.cts파일은 TypeScript의moduleResolution: "NodeNext"/"Node16"환경에서 CJS 조건에 올바른 타입을 제공한다.
export default defineConfig({
dts: true, // TypeScript 컴파일러로 .d.ts 생성
});
export default defineConfig({
dts: {
resolve: true, // 외부 타입도 인라인으로 포함
entry: 'src/index.ts',
tsconfig: './tsconfig.lib.json', // 별도 tsconfig 지정
},
});
DTS 생성은 esbuild가 아닌 TypeScript 컴파일러를 사용하므로 느릴 수 있다. 빌드 속도가 중요하면 분리 실행:
{
"scripts": {
"build": "tsup",
"build:types": "tsc --emitDeclarationOnly --outDir dist"
}
}
tsup은 package.json의 dependencies와 peerDependencies를 자동으로 external 처리한다. devDependencies는 번들에 포함된다.
export default defineConfig({
external: ['react', 'react-dom', 'lodash'],
});
export default defineConfig({
noExternal: ['some-esm-only-package'],
});
주의: CJS 포맷으로 빌드할 때 ESM-only 패키지가 external이면 런타임 에러가 발생할 수 있다. 이 경우
noExternal로 번들에 포함시킨다.
tsup src/index.ts --watch
빌드 성공 후 명령어 실행:
export default defineConfig({
entry: ['src/index.ts'],
onSuccess: 'node dist/index.js',
// 또는 함수로:
// onSuccess: async () => { /* 빌드 후 작업 */ },
});
{
"scripts": {
"build": "tsup",
"dev": "tsup --watch",
"typecheck": "tsc --noEmit"
}
}
import { defineConfig } from 'tsup';
export default defineConfig((options) => ({
entry: ['src/index.ts'],
format: ['cjs', 'esm'],
dts: true,
minify: !options.watch, // watch 모드에서는 압축 안 함
sourcemap: true,
clean: true,
}));
packages/
├── ui/
│ ├── src/
│ │ ├── index.ts
│ │ ├── Button.tsx
│ │ └── Input.tsx
│ ├── tsup.config.ts
│ └── package.json
├── utils/
│ ├── src/
│ │ └── index.ts
│ ├── tsup.config.ts
│ └── package.json
└── shared-types/
└── src/
└── index.ts ← 타입만 있으면 tsup 불필요, tsc만으로 충분
import { defineConfig } from 'tsup';
export default defineConfig({
entry: ['src/index.ts'],
format: ['esm'], // 모노레포 내부용이면 ESM만으로 충분
dts: true,
external: ['react', 'react-dom'], // peer dependencies
clean: true,
});
{
"name": "@myorg/ui",
"version": "1.0.0",
"type": "module",
"main": "./dist/index.js",
"types": "./dist/index.d.ts",
"exports": {
".": {
"import": "./dist/index.js",
"types": "./dist/index.d.ts"
}
},
"files": ["dist"],
"scripts": {
"build": "tsup",
"dev": "tsup --watch"
},
"peerDependencies": {
// turbo.json
{
"tasks": {
"build": {
"dependsOn": ["^build"],
"outputs": ["dist/**"]
},
"dev": {
"dependsOn": ["^build"],
"persistent": true
}
}
}
{
"name": "my-lib",
"type": "module",
"main": "./dist/index.cjs",
"module": "./dist/index.js",
"types": "./dist/index.d.ts",
"exports": {
".": {
"import": {
"types": "./dist/index.d.ts",
"default": "./dist/index.js"
},
"require": {
"types": "./dist/index.d.cts",
"default": "./dist/index.cjs"
}
}
},
"files": ["dist"
주의:
types조건은 반드시default보다 먼저 와야 한다. TypeScript가 조건을 순서대로 평가하기 때문에,types가 뒤에 오면 타입 해석이 무시된다.
{
"exports": {
".": {
"import": {
"types": "./dist/index.d.ts",
"default": "./dist/index.js"
},
"require": {
"types": "./dist/index.d.cts",
"default": "./dist/index.cjs"
}
},
"./utils": {
"import": {
"types": "./dist/utils.d.ts",
"default": "./dist/utils.js"
},
"require": {
"types": "./dist/utils.d.cts",
"default":
대응하는 tsup 설정:
export default defineConfig({
entry: {
index: 'src/index.ts',
utils: 'src/utils/index.ts',
},
format: ['cjs', 'esm'],
dts: true,
});
상세 레퍼런스 (예제·고급 패턴·흔한 실수) →
references/REFERENCE.md
Plugin[] |
| esbuild 플러그인 |