빌드 성능 — incremental·project references
10초 빌드를 1초로. 캐싱·분할·대체 도구.
TS 빌드는 프로젝트가 커질수록 느려집니다 — 100개 파일이면 모르겠지만 10,000개면 변경 한 번에 30초씩 걸려요. 19편은 빌드 시간을 줄이는 4가지 도구 — incremental, composite + project references, tsc --build, 그리고 esbuild/swc 같은 대체 도구.
① incremental — 캐시로 재컴파일 줄이기
{
"compilerOptions": {
"incremental": true,
"tsBuildInfoFile": ".tsbuildinfo" // 캐시 파일 위치
}
}
tsc 가 마지막 빌드 정보를 .tsbuildinfo 에 저장. 다음 빌드는 변경된 파일만 재컴파일. 거의 항상 켜야 하는 옵션.
② composite — 다른 프로젝트가 참조할 수 있게
// packages/core/tsconfig.json
{
"compilerOptions": {
"composite": true, // 다른 곳에서 참조 가능
"declaration": true, // .d.ts 생성
"outDir": "./dist",
"rootDir": "./src"
},
"include": ["src"]
}
③ project references — 모노레포
// 루트 tsconfig.json
{
"files": [],
"references": [
{ "path": "./packages/core" },
{ "path": "./packages/web" },
{ "path": "./packages/api" }
]
}
// packages/web/tsconfig.json (core 의존)
{
"compilerOptions": { ... },
"references": [
{ "path": "../core" }
]
}
# 전체 빌드 — 변경된 프로젝트만 재빌드
tsc --build
# 정리
tsc --build --clean
# 강제 전체
tsc --build --force
# watch 모드
tsc --build --watch
project references 의 진가. 모노레포에서 core 패키지만 바뀌었으면 core + 그 의존 만 재컴파일. core 가 안 바뀌었으면 web 은 캐시된 .d.ts 만 봄 — 매우 빠름. 10배 이상 단축.
④ esbuild·swc — TS 컴파일러를 우회
# tsc 가 느린 이유 — TS 가 풀 타입 체크를 함
# esbuild 와 swc 는 타입 체크 안 하고 변환만 (수십 배 빠름)
npm install -D esbuild
npx esbuild app.ts --bundle --outfile=dist.js
# 1만 줄 0.05초
# swc (vite, next.js 등이 내장)
npm install -D @swc/core
npx swc src -d dist
중요 트레이드오프. esbuild·swc 는 타입 체크를 안 합니다. 변환만 빠르게. 타입 안전은 별도로 tsc --noEmit 으로 확인해야 함. 보통의 패턴: esbuild 로 빠르게 변환 + tsc --noEmit 으로 타입 검사를 CI 에서 병렬 실행.
실전 — package.json 스크립트
{
"scripts": {
"dev": "vite", // dev (esbuild 기반)
"build": "vite build", // prod (rollup + esbuild)
"typecheck": "tsc --noEmit", // 타입만 검사
"build:full": "npm run typecheck && npm run build"
}
}
큰 코드베이스 — 점진 최적화 가이드
| 증상 | 해결 |
|---|---|
| 전체 빌드 30초 | incremental: true |
| 변경 1개에도 10초 | project references 로 분리 |
| node_modules 로딩 느림 | skipLibCheck: true |
| VS Code 가 느림 | project references + 작은 단위로 분리 |
| CI 가 느림 | esbuild 변환 + 별도 tsc 타입 체크 병렬 |
| test 가 느림 | vitest (esbuild 기반) 또는 swc-jest |
tsconfig 빌드 옵션 한 줄 정리
{
"compilerOptions": {
"incremental": true, // 캐시 (거의 항상)
"skipLibCheck": true, // node_modules .d.ts 건너뜀
"isolatedModules": true, // 파일별 변환 도구 호환
"composite": true, // 다른 프로젝트가 참조 가능 (필요시)
"declaration": true, // .d.ts 생성 (composite 면 필수)
"declarationMap": true, // 디버깅 — Go to definition
"sourceMap": true // 런타임 디버깅용
}
}
측정 — 어디가 느린지
# 진단 모드
tsc --extendedDiagnostics
# Output:
# Files: 123
# Lines of Library: 42385
# Lines of Definitions: 9824
# Nodes of Library: 93892
# Types: 1234
# Memory used: 182MB
# Total time: 3.21s
# Parse time: 0.45s
# Bind time: 0.20s
# Check time: 2.10s ← 타입 체크가 대부분
# Emit time: 0.41s
# 추적
tsc --generateTrace ./trace
# Chrome DevTools 의 Performance 탭에 trace.json 드래그
핵심 결론. Check time(타입 체크) 가 대부분 → esbuild 로 변환만 빠르게, tsc 는 typecheck 만. 분리하면 dev 가 가볍고, CI 에서만 풀 typecheck.
20편 — 실전 패턴 (Result·Branded·exhaustive) [최종편]
20편 시리즈의 마지막. 진짜 코드에서 자주 쓰는 패턴 모음.
📚 쉽게 배우는 타입스크립트 교재
이전: 18편 strict · 현재: 19편 (고급) · 다음 → 20편 실전 패턴 (시리즈 마지막) · 진행: 19/20
이전: 18편 strict · 현재: 19편 (고급) · 다음 → 20편 실전 패턴 (시리즈 마지막) · 진행: 19/20