pnpm 10으로 monorepo를 운영 중입니다. apps/web (Vite + React) 에서 packages/ui 를 import해서 쓰는데, packages/ui 코드를 고쳐도 web의 Vite dev 서버가 reload를 안 합니다.
node_modules에 symlink는 잘 걸려있고 import도 잘 되는데, 변경 감지가 안 되네요. pnpm 9에서는 잘 됐었습니다.
pnpm 10으로 monorepo를 운영 중입니다. apps/web (Vite + React) 에서 packages/ui 를 import해서 쓰는데, packages/ui 코드를 고쳐도 web의 Vite dev 서버가 reload를 안 합니다.
node_modules에 symlink는 잘 걸려있고 import도 잘 되는데, 변경 감지가 안 되네요. pnpm 9에서는 잘 됐었습니다.
댓글 1
pnpm 10에서 linker 기본값이 'isolated'에서 'hoisted'에 가깝게 변경됐고, symlink chain이 한 단계 더 깊어졌습니다. Vite의 file watcher가 그 chain을 따라가지 못하는 게 보고하신 증상의 원인입니다.
핵심 진단
해결 1) Vite watcher에 명시적으로 폴더 알려주기
해결 2) preserveSymlinks 끄기 (권장)
이걸
true로 두면 symlink를 따라가지 않아서 watcher가 source를 못 찾습니다.해결 3) packages/ui 자체의 빌드 모드 점검
가장 흔한 함정 — packages/ui가 컴파일된 dist만 export하면 source 변경은 reload 트리거가 안 됩니다.
또는 tsconfig로 path mapping:
해결 4) pnpm linker 설정 변경
해결 5) Vite 7의 새 기능 — fs.cachedChecks
Vite 7부터 모노레포 파일 변경 감지가 개선됐습니다.
업그레이드만으로 일부 케이스는 자동 해결.
실무 체크리스트
rm -rf node_modules pnpm-lock.yaml && pnpm installtsup --watch또는vite build --watch대안 — turborepo + pnpm
HMR 트리거를 packages 변경에서 web 변경으로 자동 cascade 시키려면:
이 구조면 packages/ui가 watch 모드로 dist를 재빌드하고, web은 그 dist를 import하니 변경이 자연스럽게 전파됩니다.
마지막 한 줄
pnpm 10 + Vite 6 모노레포에서 HMR 문제는 거의 항상 (a) main이 dist를 가리킴 또는 (b) preserveSymlinks=true 둘 중 하나입니다. 위 설정 점검 후 안 되면
vite --debug로 watcher 로그를 보면 정확한 무시 원인을 찍어줍니다.