4개 파일과 디렉토리 하나가 모든 npm 관리 프로젝트 carry. 각각 뭐 하는지 알면 명령 돌리는 사람에서 디버깅 가능한 사람으로 변신.
package.json 이 프로젝트 manifest. 프로젝트 이름, 버전, 스크립트, 런타임 deps, dev deps, peer deps, entry point (main/module/exports), 메타데이터 선언. 모든 JS 도구가 이걸 읽음. 프로젝트 신분증으로 다뤄; 모든 변경 commit.
package-lock.json 이 install 된 패키지의 정확한 트리, transitive deps + 콘텐츠 hash 포함. 항상 commit. 팀과 모든 CI run 이 동일한 byte install 보장하는 거. 수동 편집 금지; npm 자체만 다시 써야 함.
node_modules/ 가 패키지가 물리적으로 사는 곳. 절대 commit 안 함 (항상 .gitignore). npm 의 구조는 대부분 flat, 공통 deps 위로 dedup — 빠르지만 phantom deps 허용 (코드가 package.json 에 선언 안 된 패키지 우연히 import). pnpm 이 이걸 fix; npm 은 안 해.
Workspaces 가 한 repo 에서 multiple sub-package 실행 가능하게 함. root package.json 에 sub-package path 가리키는 workspaces array 선언; npm 이 공유 deps 를 root node_modules 로 hoist. monorepo 지원 — 기본적이지만 작동. (pnpm 과 Yarn 이 여기 더 강함.)