// apps/web uses workspace dep
// package.json: "@acme/ui": "workspace:*"
import{Button}from"@acme/ui";
Pattern 3: Module Federation (Webpack/Rspack)
newModuleFederationPlugin({name:"shell",remotes:{checkout:"checkout@https://cdn/checkout/remoteEntry.js"},shared:{react:{singleton:true},"react-dom":{singleton:true}},});// 런타임에 다른 팀 빌드 import
Pattern 4: Affected-only CI (Nx)
- run:npx nx affected -t build test lint --base=origin/main# 변경된 프로젝트와 의존하는 프로젝트만 실행
Pattern 5: Remote cache
# Turborepo Vercel remote cache
turbo login && turbo link
# 또는 self-hosted (Cloudflare R2)TURBO_API=... TURBO_TOKEN=... turbo build
Pattern 6: Design system token boundary
// packages/tokens
exportconsttokens={color:{brand:{500:"#5B21B6"}},space:{1:"4px",2:"8px"},}asconst;// packages/ui consumes tokens — never hard-coded values
// .eslintrc — apps 가 다른 app 을 직접 import 못하도록
"@nx/enforce-module-boundaries":["error",{"depConstraints":[{"sourceTag":"scope:web","onlyDependOnLibsWithTags":["scope:shared","scope:web"]},{"sourceTag":"type:app","onlyDependOnLibsWithTags":["type:lib"]}]}]
Pattern 9: Per-package versioning (Changesets)
pnpm changeset # 변경 기록
pnpm changeset version # version bump
pnpm publish -r # publish 변경된 package 만
매 결정 기준
상황
Approach
공유 코드 많음, 같은 release
Monorepo + Turborepo
거대 + 그래프 분석 필요
Nx (affected, codegen, plugin)
진짜 독립 팀 + 별 cadence
Module Federation
Iframe 격리 필요 (legacy)
Iframe 합성
Design 일관성
Design system + tokens
기본값: pnpm + Turborepo + design system + Changesets, MFE 는 마지막 수단.