Learn

스크립트와 lockfile

npm run으로 작업 실행하기, lock 파일의 역할 이해하기, 그리고 왜 커밋해야 하는지.

package.json은 의존성 목록만 있는 게 아니에요 : 긴 명령어를 실행하는 단축키인 스크립트도 정의해요. 그리고 lockfile은 설치가 재현 가능하도록 보장해요.

package.json의 스크립트

package.jsonscripts 섹션은 명령어 단축키를 정의해요:

json
{
  "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으로:

shell
pnpm run dev

pnpm 단축키(run 없이):

shell
pnpm dev
shell
pnpm build
shell
pnpm test

bun으로:

shell
bun run dev
shell
bun dev

npm으로:

shell
npm run dev

특별한 스크립트 : pre와 post

pnpm과 npm은 다른 스크립트 전후에 실행할 스크립트의 prepost 접두사를 인식해요:

json
{
  "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은 이 정확한 버전들을 기록해요:

yaml
# pnpm-lock.yaml 발췌
react:
  specifier: ^18.3.0
  version: 18.3.1

lockfile 없이 이틀 간격으로 같은 프로젝트를 클론한 두 개발자는, 그 사이에 패키지가 업데이트됐다면 다른 버전을 설치할 수 있어요. lockfile이 있으면 모두 정확히 같은 버전을 가져요.

세 가지 lockfile

패키지 매니저Lock 파일형식
npmpackage-lock.json읽을 수 있는 JSON
pnpmpnpm-lock.yaml읽을 수 있는 YAML
bunbun.lockb바이너리

레포당 lockfile 하나

같은 프로젝트에서 두 개의 lockfile(package-lock.jsonpnpm-lock.yaml)이 보인다면 문제가 있어요. 누군가 잘못된 패키지 매니저를 실행한 거예요. 하나를 삭제(그리고 node_modules/도)하고 올바른 매니저로 재설치하세요.

pnpm으로 마이그레이션하기 전 정리 명령어:

shell
rm -rf node_modules package-lock.json
shell
pnpm install

pnpm lockfile 형식

관련

참고 · vercel첫 번째 프로젝트 배포하기

다음 단계를 열려면 단계를 체크하세요

코스로 돌아가기