안녕하세요. npm 7이 발표된지 꽤 됐지만.. 묵혀두었던 문서를 비공개 저장소에 두기는 아쉬워 지금이라도 공개하려고 합니다.
NPM 7.0.0 Release
Node v15.0.0이 발표와 함께 npm v7.0.0도 발표되었습니다.
npm 7.0.0에는 어떠한 새로운 기능들이 있는지 천천히 살펴볼까 합니다.
그 전에.. npm이 무슨일을 할까?
npm 이란 Node Package Manager의 약자료 노드 패키지 매니저 입니다. 세상에 수많은 JavaScript개발자들이 자바스크립트 패키지를 만들었고, 그런 코드가 공개되어있는곳이 npm입니다.
말 그대로 노드 패키지 관리소 입니다.
다른 사람들이 이미 개발해 둔 기능을 npm을 통해 간편하게 가져다 사용할 수 있는 것입니다.
package.json파일을 통해 무수히 많은 패키지들 중 프로젝트에 필요한 패키지와 버전정보를 관리할 수 있습니다.
npm init명령어를 통해 손쉽게 파일을 생성할 수 있습니다.
npm 7.0.0에서 생긴/바뀐 기능
- 워크스페이스 지원: 여러 패키지를 하나로 묶어서 관리
- 피어 디펜던시 자동 설치: 연관된 패키지들을 자동으로 설치
- package-lock.json v2 포맷 적용 및 yarn.lock 지원
- Breaking Changes
- 피어 자동설치 적용
- package.json이 exports필드를 정의해서, 이제는 npm 내부모듈을 require()할 수 없음
- npx가 npm exec를 호출하도록 변경. 하위 호환은 유지하지만 몇몇 변경사항이 있음
- npm aduit의 출력 형식 변경
출처: https://github.blog/2020-10-13-presenting-v7-0-0-of-the-npm-cli/
워크스페이스 지원
최상위 루트에서 아래 여러 패키지들을 관리할 수 있습니다.
package.json
// Given this package.json structure:
├── package.json { "workspaces": ["dep-a", "dep-b"] }
├── dep-a
│ └── package.json { "dependencies": { "dep-b": "^1.0.0" } }
└── dep-b
└── package.json { "version": "1.3.1" }
$ npm install
// Results in this symlinking structure:
├── node_modules
│ ├── dep-a -> ./dep-a
│ └── dep-b -> ./dep-b
├── dep-a
└── dep-b이러한 기능은 lerna라는 프로젝트에서 지원하는 기능과 비슷합니다.
npm에서 심볼릭 링크
$ cat ./package.json
{
"name": "foo",
"version": "1.0.0",
"workspaces": [
"./core/*",
"./packages/*"
],
dependencies: {
"lodash": "^4.x.x",
"libnpmutil": "^1.0.0"
}
}
$ cat ./core/libnpmutil/package.json
{
"name": "libnpmutil",
"version": "1.0.0",
"dependencies": {
"lodash": "^4.x.x"
}
}
$ cat ./packages/workspace-a/package.json
{
"name": "workspace-a",
"version": "1.7.3",
"peerDependencies": {
"react": "^16.x.x"
},
"dependencies": {
"workspace-b": "^2.0.0"
}
}
$ cat ./packages/workspace-b/package.json
{
"name": "workspace-b",
"version": "2.1.1",
"peerDependencies": {
"react": "^16.x.x"
}
}
$ cat ./packages/workspace-c/package.json
{
"name": "workspace-c",
"version": "1.0.0",
"peerDependencies": {
"react": "^16.x.x"
},
"dependencies": {
"workspace-b": "^1.0.0"
}
}이렇게 설정된 프로젝트에서 심볼릭 링크는 아래와 같이 설정됩니다.
$ tree
.
├── package-lock.json
├── node_modules
│ ├── lodash
│ ├── libnpmutil -> ./core/libnpmutil
│ ├── workspace-a -> ./packages/workspace-a
│ ├── workspace-b -> ./packages/workspace-b
│ ├── workspace-c -> ./packages/workspace-c
│ └── react
├── core
│ └── libnpmutil
└── packages
├── workspace-a
├── workspace-b
└── workspace-c
└── node_modules
└── workspace-b@1.0.0