본문 바로가기
Node.js

Node.js 교과서 2주차

by WhoamixZerOne 2022. 5. 25.

✔ NPM(Node Package Manager)

  • 노드의 패키지 매니저
  • 다른 사람들이 만든 소스 코드들을 모아둔 저장소

✔ package.json

"$ npm init" 명령어로 package.json 파일을 만들어 프로젝트의 설정 등을 기록해주는 파일

  • scripts : 별칭을 사용하여 명령어를 사용(ex. "start": "node index" - "$ npm run(생략 가능) start")
  • dependencies : "$ npm i 패키지명"으로 설치한 의존 패키지(배포용 패키지)
  • devDependencies : "$ npm i -D(--save-dev 동일) 패키지명"으로 설치한 의존 패키지(개발용 패키지)

"$ npm i -g(--global 동일) 패키지명"은 글로벌 설치로 전역 설치(사용자가 설치한 node 경로에 설치)가 되고,

dependencies에 기록이 안된다. 기록이 안되기 때문에, 실제 사용 패키지 확인이 어려워서 좋은 방식이 아니다.

사용하고자 하면, 개발용 패키지로 설치하고 "scripts"에 추가해서 사용하거나 "npx" 명령어를 통해 사용할 수 있다.

✔ package-lock.json

package-lock.json 파일은 "$ npm -i 패키지명"으로 패키지를 설치해서 node_modules 트리, package.json 변경이 되면 자동으로 생성되는 파일이다. 생성되는 시점의 의존성 트리에 대한 정확한 정보를 가지고 있다.

 

만약 사용자가 "$ npm -i express" 명령으로 express 패키지를 설치했다면, node_modules 트리에는 express가 있어야 하는데, express만 있는 게 아니라 express를 사용하는데 필요한 의존성 패키지들이 같이 설치가 되고,

그 내용들이 package-lock.json에 정확한 정보가 기록이 된다.

그러면 왜 package.json에서 정확한 정보를 기록하지 않고, package-lock.json 파일을 별도로 만드는 이유는 package.json에 패키지 의존성 선언의 버전 정보를 "version range"로 사용하기 때문이다. "version range"는 특정 버전(고정 버전)이 아니라 버전의 범위를 말한다.

 

만약 기존 인원은 express 버전을 4.16.1 사용하고 있는데 다른 인원은 express 버전이 5.1.0로 업데이트된 버전이고 업데이트된 기능을 새로 추가하면 기존 인원은 사용하다가 에러가 발생할 수도 있다. 이런 문제 등으로 "version range"를 사용한다.

그리고 package-lock.json 파일이 존재할 경우에는 "$ npm i" 명령 시 package.json을 사용하여 node_modules 트리를 생성하지 않고 package-lock.json을 사용하여 node_modules 트리를 생성한다.

✔ SemVer 버저닝

노드의 패키지 버전은 SemVer(유의적 버저닝) 방식을 따른다.

  • Major(주 버전)
  • Minor(부 버전)
  • Patch(수 버전)
  • Major는 하위 버전과 호환되지 않은 수정 사항이 생겼을 때 올림
  • Minor는 하위 버전과 호환되는 수정 사항이 생겼을 때 올림
  • Patch는 기능에 버그를 해결했을 때 올림
4 . 16 . 1
Major   Minor   Patch
  • ^(caret 캐럿) : 캐럿은 패키지의 마이너, 패치 변경을 허용한다는 의미
    • ^4와 같다는 얘기다. 메이저는 무조건 그대로고, 마이너와 패치만 변경되는 걸 허용
    • ^4.16.1은 "4.16.1 <= 이상, < 5.0.0 미만"과 같다
  • ~(tilde 틸드) : 틸드는 패키지의 패치 변경을 허용한다는 의미
    • ~4.16와 같다는 얘기다. 메이저, 마이너는 무조건 그대로고, 패치만 변경되는 걸 허용
    • ~4.16.1은 "4.16.1 <= 이상, < 4.17.0 미만"과 같다
  • >=, <=, >, < : 이상, 이하, 초과, 미만
  • @latest : 최신
  • @next : 가장 최신 배포판 사용 가능
  • 알파/베타/RC 버전이 존재(1.1.1-alpha.0, 2.0.0-beta.1, 2.0.0-rc.0)

"$ npm i express@latest/@3" 등으로도 가능하지만, 대부분 캐럿으로 사용한다.

 

자세한 내용은 아래 링크 참조
SemVer

✔ NPM 배포

  • "$ npm adduser"로 로그인
  • "$ npm publish"로 배포
  • "$ npm info 배포명"로 배포 확인(배포명은 package.json의 name)
  • "$ npm unpublish --force"로 배포 중단

✔ NPX(Node Package eXecute)

npx는 노드 패키지를 실행시키는 하나의 도구이다.

만약 "$ npm i -D nodemon" 패키지를 개발에 설치하고 "$ nodemon app" 실행한다고 하면,

nodemon이 무엇인지 못 찾아 "command not found"로 실패할 것이다.

그러면 패키지를 실행하기 위해서는 로컬 경로에서 실행하거나, "$ ./node_modules/.bin/nodemon app"

package.json 파일의 scripts에 선언을 해주어야 한다.

...
"scripts": {
  "start": "nodemon app"
}
...

"$ npm run(생략 가능) start"로 실행을 하거나 npx를 사용하여 간편하게 할 수도 있다.

"$ npx nodemon app"

개인적으로는 "scripts"에 "start"를 추가해주고 사용하는 게 더 좋은 것 같다.

 

그리고 npx는 1번만 실행되어야 하는 명령에 유용하다.

npm 레지스트리에서 해당 이름을 찾고서 없으면 자동으로 설치하고 호출하는데, 호출이 끝나고 난 뒤 패키지는 fallback 되어 사라진다. 이렇게 1회성으로 사용하는 명령에 유용하다.

자세한 내용은 아래 링크 참조
npm - npx

 

 

 

🔗 Reference

 

package.json | npm Docs

Specifics of npm's package.json handling

docs.npmjs.com

 

Semantic Versioning 2.0.0

Semantic Versioning spec and website

semver.org

 

npx

execute npm package binaries. Latest version: 10.2.2, last published: 2 years ago. Start using npx in your project by running `npm i npx`. There are 104 other projects in the npm registry using npx.

www.npmjs.com

 

 

 

 

 

 

 

 

'Node.js' 카테고리의 다른 글

[NestJS] Configuration 설정 & TypeORM 연결  (0) 2023.05.31
Node.js 구조 & 동작 원리  (0) 2022.08.17
Node.js 교과서 4주차  (0) 2022.06.09
Node.js 교과서 3주차  (0) 2022.06.01
Node.js 교과서 1주차  (1) 2022.05.14

댓글