npm은 말 그대로 노드 패키지를 설치하고 관리하는 패키지 매니저다.
자바스크립트로 된 프로젝트를 할 때 다른 사람의 코드에서 사용된 패키지를 npm을 사용해서 설치를 할 수 있다.
웹사이트, 웹앱, 노드를 사용한 서버사이드 등 자바스크립트를 사용하는 모든 프로젝트에서 npm을 사용할 수 있다.
어떤 사람이 npm에 배포한 코드를 말한다.
패키지는 라이브러리를 포함할 수도 있으며, 일반적으로 라이브러리와 실행파일을 포함한다.
모두 npmjs.com에서 찾을 수 있다.
프로젝트에서는 아주 많은 패키지를 사용하게 된다.
이런 패키지들의 버전이 빈번하게 업데이트 되므로 프로젝트가 의존하고 있는 패키지들이 관리될 필요가 있다.
npm에서는 package.json 파일로 프로젝트의 정보와 패키지들의 의존성을 관리한다.
package.json 에는 사용하고 있는 패키지들의 명세가 작성되어 있기 때문에 프로젝트를 다른 사람에게 공유하고 싶다면 package.json을 공유해 개발 환경을 빠르게 구축할 수있다.
package.json이 존재하지 않으면 npm init
으로 생성할수있다.
패키지 설치
npm install
: 패키지명을 명시하지 않고 package.json 파일의 의존성을 설치하는 동작
npm install <package_name>
: 패키지명을 명시해 특정 패키지를 설치하는 동작
전역에 패키지를 설치하려면 npm install 명령어에 -g 옵션을 지정한다.
npm install (패키지명) 은 프로젝트 폴더에 패키지를 설치했지만, -g 플래그를 통해 패키지를 설치하면 시스템 폴더에 패키지를 설치하게 된다.
전역에 설치된 패키지는 OS에 따라 설치 장소가 다르다.
macOS의 경우
/usr/local/lib/node_modules
윈도우의 경우
c:\Users\%USERNAME%\AppData\Roaming\npm\node_modules
전역으로 모듈을 설치하게 된다면, 설치한 모듈명을 명령어로 사용할수 있게 된다.
-P, --save-prod 플래그의 효과는 기본 $ npm install (프로젝트) 와 완전히 동일.
-P 플래그는 패키지를 설치한 후 프로젝트의 dependencies 목록에 추가.
-D 플래그는 기본 -P 와 동일하게 프로젝트의 node_modules 폴더에 패키지를 설치하지만, 패키지명을 dependencies 가 아닌 devDependencies 에 기록.
충돌하는 peer dependency들을 루트 프로젝트에 설치하여 에러를 해결
충돌하는 peer dependency가 맞지 않는 것을 무시하고 설치를 진행
--legacy-peer-deps를 사용할 경우 peer dependency가 맞지 않음에도 설치를 진행하므로 예기치 못한 에러가 발생할 수 있으니 --force로 해결되지 않을 때 사용하는 것이 좋다.
npm update <package_name>
: 특정 패키지를 업데이트
npm update
: 모든 패키지의 업데이트
npm update <package_name> -g
: 글로벌 패키지 업데이트
npm uninstall <package_name>
: 특정 패키지 삭제
npm uninstall <package_name> -g
: 글로벌 패키지 삭제
npm list depth <number_>
: 설치된 패키지의 리스트 보기
npm help
: 도움말 보기
npm <command> -h
: 특정 코멘드에 대한 도움말
npm help -search <command>
: 특정 코멘드 npm의 documentation에서 검색하기
유용한 패키지들을 받아서 쉽게 사용가능
세계 최대 규모의 패키지들을 보유하고 있고 Node 생태계를 견고하게 해준다.
즉, 관련 커뮤니티도 이미 많이 활성화되어있어 접근성이 좋다.
저장소의 취약한 보안이슈, 의존 패키지의 버저닝 이슈
패키지가 많아짐에 따라 빌드 성능이 떨어짐
글로벌 모듈의 설치시 모듈의 업데이트 확인이 되지않아 위험하여 npx를 사용하는 것이 좋다.
npm 5.2버전부터, npx가 기본 패키지로 제공. npx도 모듈의 일종입니다. 이 모듈은 npm을 통해 모듈을 로컬에 설치했어야만 실행시킬 수 있었던 기존 문제점의 해결책이 되었다. 모듈을 로컬에 저장하지 않고, 매번 최신 버전의 파일만을 임시로 불러와 실행 시킨 후에, 다시 그 파일은 없어지는 방식으로 모듈이 돌아가고 있다.
create-react-app같은 보일러 플레이트 모듈에 효과적이다. npx를 통해 create-react-app을 설치할 경우에는 매번 최신 버전만을 가져와서 설치해 주기 때문에 지금 어떤 버전을 사용하고 있는 지 신경쓸 필요가 없어진다.
https://stackoverflow.com/questions/66020820/npm-when-to-use-force-and-legacy-peer-deps
https://github.blog/2021-02-02-npm-7-is-now-generally-available/
https://velog.io/@kysung95/%EA%B0%9C%EB%B0%9C%EC%83%81%EC%8B%9D-npm%EA%B3%BC-yarn
https://joshua1988.github.io/vue-camp/package-manager/npm-vs-yarn.html