Node NPM 7.0.0 Release
npm 7에서 달라지는점 살펴보기
  • Infra

안녕하세요. 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을 통해 간편하게 가져다 사용할 수 있는 것입니다.

https://www.npmjs.com/

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