피드로 돌아가기
Dev.toFrontend
원문 읽기
Next.js 16 Turbopack 환경 내 pnpm Hoisting 충돌 해결을 통한 CI 안정화
pnpm workspaces in a Next.js 16 monorepo: what the benchmark didn't measure and almost broke my CI
AI 요약
Context
pnpm Workspaces의 엄격한 Isolation 모델이 Next.js 16 App Router 및 Turbopack의 모듈 해석 방식과 충돌하는 문제 발생. 특히 CI 환경의 Partial Cache 상황에서 Peer Dependency 버전 불일치로 인한 모듈 참조 오류가 비결정적으로 나타나는 한계점 분석.
Technical Solution
- .npmrc 내 public-hoist-pattern 설정을 통한 React 등 핵심 Peer Dependency의 전략적 Hoisting 구현
- pnpm.overrides를 활용하여 워크스페이스 전반의 의존성 버전을 강제로 동기화함으로써 중복 인스턴스 생성 방지
- Turbopack의 Node.js 알고리즘 기반 모듈 탐색 경로에서 발생 가능한 버전 충돌을 원천적으로 차단하는 구조 설계
- shamefully-hoist=true의 과도한 허용 대신 필요한 패키지만 선택적으로 Hoisting 하여 Dependency Isolation 이점 유지
- Lockfile 전체 기반의 Cache Key 전략을 도입하여 CI 환경의 비결정적 빌드 결과 제거
실천 포인트
1. pnpm why <package> --recursive 명령어로 워크스페이스 내 중복 Peer Dependency 존재 여부 확인
2. .npmrc에 public-hoist-pattern을 설정하여 런타임 공유 라이브러리의 호이스팅 제어
3. pnpm.overrides를 통해 모든 패키지가 동일한 버전의 React/Next.js를 참조하도록 강제
4. CI 파이프라인의 캐시 키를 Lockfile 전체 해시값으로 설정하여 일관성 확보