package.json은 의존성 목록만 있는 게 아니에요 : 긴 명령어를 실행하는 단축키인 스크립트도 정의해요. 그리고 lockfile은 설치가 재현 가능하도록 보장해요.
package.json의 스크립트
package.json의 scripts 섹션은 명령어 단축키를 정의해요:
{
"scripts": {
"dev": "vite --port 3000",
"build": "vite build",
"preview": "vite preview",
"test": "vitest",
"lint": "eslint . --ext .ts,.tsx",
"typecheck": "tsc --noEmit",
"format": "prettier --write ."
}
}스크립트 실행하기
pnpm으로:
pnpm 단축키(run 없이):
bun으로:
npm으로:
특별한 스크립트 : pre와 post
pnpm과 npm은 다른 스크립트 전후에 실행할 스크립트의 pre와 post 접두사를 인식해요:
{
"scripts": {
"prebuild": "pnpm typecheck",
"build": "vite build",
"postbuild": "node scripts/compress-assets.js"
}
}pnpm build는 자동으로 prebuild, 그 다음 build, 그 다음 postbuild를 실행해요.
lockfile의 역할
package.json은 버전 범위(^18.3.0)를 선언해요. 하지만 pnpm install을 실행하면 pnpm이 해당 범위를 해결해서 정확한 버전을 설치해요.
lockfile은 이 정확한 버전들을 기록해요:
# pnpm-lock.yaml 발췌
react:
specifier: ^18.3.0
version: 18.3.1lockfile 없이 이틀 간격으로 같은 프로젝트를 클론한 두 개발자는, 그 사이에 패키지가 업데이트됐다면 다른 버전을 설치할 수 있어요. lockfile이 있으면 모두 정확히 같은 버전을 가져요.
세 가지 lockfile
| 패키지 매니저 | Lock 파일 | 형식 |
|---|---|---|
| npm | package-lock.json | 읽을 수 있는 JSON |
| pnpm | pnpm-lock.yaml | 읽을 수 있는 YAML |
| bun | bun.lockb | 바이너리 |
레포당 lockfile 하나
같은 프로젝트에서 두 개의 lockfile(package-lock.json과 pnpm-lock.yaml)이 보인다면 문제가 있어요. 누군가 잘못된 패키지 매니저를 실행한 거예요. 하나를 삭제(그리고 node_modules/도)하고 올바른 매니저로 재설치하세요.
pnpm으로 마이그레이션하기 전 정리 명령어:
pnpm lockfile 형식