프론트를 개발하며 숨쉬듯 사용했던 npm install, npm run dev, npm run build.
그러나 내가 사용하고 있는 npm이 정확히 무엇인지, 제대로 알고 있지 않았다.
NPM은 Node.js의 패키지를 관리할 수 있는 도구이다.
Python의 pip나 Ruby의 gem처럼, 웹 사이트에서 패키지를 다운로드하여 컴퓨터에 설치할 수 있다.
공식 문서를 따라가며 NPM이 무엇인지 제대로 알아보자.
npm은 세상에서 가장 큰 소프트웨어 저장소이다.
개인부터 조직까지 npm을 통해 오픈 소스 개발부터 사내 개발을 관리하고 있다.
npm을 구성하는 것은 다음 세 가지 요소이다.
About packages and modules | npm Docs
packages와 modules은 다음과 같이 구분된다.
package.json
에 의해 정의되는 파일이나 디렉토리package.json
을 포함하며 npm registry 상에 배포되어 있어야 한다.require()
함수로 불러올 수 있는 node_modules
디렉토리의 파일이나 디렉토리이다.package.json
에 “main” 필드가 포함된 폴더나, JS 파일이 이에 해당한다.모든 모듈이 패키지는 아니며, package.json
파일을 가진 모듈을 패키지로 간주한다.
굉장히 길다. 몇몇 부분만 발췌해보았다.
package.json은 문서이다. 개발자가 배포한 패키지에 대해 설치, 관리를 할 때 도움이 될 문서이다.
패키지가 무엇을 의존하며, 어떤 버전이고 어떻게 배포하는지에 대한 명세가 담겨있다.
{
"name": "ultra-exact-ncst",
"version": "1.1.6",
"description": "nowcast with coordinate",
"main": "dist/index.js",
"type": "module",
"scripts": {
"build": "tsc",
"start": "node dist/index.js",
"test": "npx ts-node src/index.ts"
},
"author": "GulSam00",
"license": "ISC",
"Keywords": [
"nowcast",
"coordinate"
],
"dependencies": {
"axios": "^1.7.7",
"date-fns": "^4.1.0"
},
"devDependencies": {
"dotenv": "^16.4.5",
"typescript": "^5.6.3"
},
"files": [
"dist/**/*"
]
}
위는 내가 직접 만든 패키지의 package.json이다. 배포하는 패키지에는 어떤 요소가 들어가는지 확인해보자.
require("ultra-exact-ncst")
를 호출했을 때, main에 지정한 모듈을 export
가 반환되는 것이다.main
이 설정되지 않으면 기본값으로 패키지의 루트 폴더에 있는 index.js
파일이 사용된다.dist/index.js
라는 이름으로 저장되었기에, 해당 경로를 설정해주었다."module"
로 설정하면 모든 js 파일을 ESM(ES modules)로 간주한다."module"
로 설정해주자…!files
필드는 패키지가 종속성으로 설치될 때 포함될 항목을 설명하는 파일 패턴 배열이다.Workspaces(워크스페이스)는 npm CLI에서 제공하는 기능 집합을 지칭하는 일반적인 용어로, 단일 최상위 루트 패키지 내에서 로컬 파일 시스템의 여러 패키지를 관리할 수 있도록 지원하는 기능이다.
간단하게 말하면 한 package.json에서 packages라는 이름으로 구분된 작업 영역을 만들 수 있는 기능이다. 별개의 폴더를 만든다고 생각해도 좋다.
{
"name": "workspace-example",
"version": "1.0.0",
"workspaces": [
"packages/a",
"packages/b",
"packages/c"
]
}
각 패키지는 독립적인 폴더와 package.json이 존재하며, 루트인 레포지토리에서 모든 패키지 의존성을 한 번에 설치하거나 업데이트 할 수 있다.
workspace의 개별 패키지에 모듈을 설치를 하더라도 실제 모듈은 루트의 node_modules에 설치된다. 워크스페이스 내의 패키지들은 심볼릭 링크로 패키지에 접근할 수 있다.
동일한 모노레포 내의 패키지 간에 의존성을 자동으로 link하기에, 한 패키지가 다른 패키지를 의존성으로 사용할 경우 별도의 네트워크 요청 없이 바로 로컬에서 링크되어 개발 및 테스트 환경이 빨라진다.
한 레포 안에 여러 프로젝트가 있는 모노레포 환경을 쉽게 구성하고 관리할 수 있다.