C.W.K.
Stream
Lesson 04 of 05 · published

package.json, lockfile, node_modules, workspaces

~12 min · npm, concepts, internals

Level 0초심자
0 XP0/55 lessons0/16 achievements
0/80 XP to next level80 XP to go0% complete

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 이 여기 더 강함.)

Code

진짜 package.json 모양·json
{
  "name": "my-project",
  "version": "0.1.0",
  "type": "module",
  "scripts": {
    "dev": "vite",
    "build": "vite build",
    "test": "vitest run"
  },
  "dependencies": {
    "react": "^19.0.0",
    "react-dom": "^19.0.0"
  },
  "devDependencies": {
    "vite": "^8.0.0",
    "vitest": "^2.0.0",
    "typescript": "^5.6.0"
  }
}
Workspace 셋업·json
// Root package.json 이 workspaces 선언
{
  "name": "my-monorepo",
  "private": true,
  "workspaces": ["packages/*", "apps/*"]
}

// 그러면 root 에서 'npm install' 이 모든 sub-package deps install
// root node_modules 통해 공유.

External links

Exercise

진짜 프로젝트의 package.json 열고 식별: 모든 스크립트, 모든 dep, 모든 devDep, entry point, ESM ('type': 'module') 인지 CommonJS 인지. 각 항목이 왜 거기 있는지 설명 못 하면, 프로젝트가 어떻게 빌드되는지 한 조각 놓치고 있는 거.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.