node 설치가 필요합니다. 그리고 라이브러리를 위한 개발 폴더를 위해 다음과 같은 명령 수행이 필요합니다.
mkdir -p ~/dev/my-libary cd ~/dev/my-libary npm init -y npm install -D typescript tsup mkdir src
src/index.ts에 다음 코드를 입력합니다.
export function add(left: number, right: number): number {
return left + right;
}
index.ts는 진입점이 되므로 사용자에게 공개할 것들을 export하는 것이 주목적입니다. 실제 API에 대한 코드는 별도의 코드 파일을 통해 제공하는 것이 일반적입니다.
tsconfig.json 파일을 생성해 다음처럼 입력합니다.
{
"compilerOptions": {
"target": "ES2022",
"module": "NodeNext",
"moduleResolution": "NodeNext",
"strict": true,
"noEmit": true,
"verbatimModuleSyntax": true
},
"include": ["src"]
}
package.json 파일의 내용을 아래처럼 구성합니다.
{
"name": "@YOUR_NPM_ID/my-libary",
"version": "1.0.1",
"description": "타입스크립트로 만든 테스트 라이브러리",
"type": "module",
"main": "./dist/index.cjs",
"module": "./dist/index.js",
"types": "./dist/index.d.ts",
"exports": {
".": {
"types": "./dist/index.d.ts",
"import": "./dist/index.js",
"require": "./dist/index.cjs",
"default": "./dist/index.js"
}
},
"files": [
"dist"
],
"scripts": {
"build:js": "tsup src/index.ts --format esm,cjs --clean",
"build:types": "tsc -p tsconfig.build.json",
"build": "npm run build:js && npm run build:types",
"check": "tsc --noEmit",
"prepack": "npm run check && npm run build"
},
"keywords": [
"typescript",
"library"
],
"license": "MIT",
"devDependencies": {
"tsup": "^8.5.1",
"typescript": "^7.0.2"
}
}
타입스크립트 코드의 타입 오류를 검사하고 빌드 하기 위해 다음 명령을 수행합니다.
npm run check npm run build
dist 폴더가 생성되고 이 폴더 안에 index.js, index.cjs, index.d.ts 가 생성되어야 합니다.
실제 npm에 배포하기 위한 파일 생성을 시험해 보기 위해 다음 명령을 수행합니다.
npm pack --dry-run
출력되는 내용에서 dist/index.js, dist/index.cjs, dist/index.d.ts, package.json이 tar로 묶이는지 확인하면 됩니다. 만약 README.MD와 LICENSE 파일을 package.json 파일이 위치한 같은 폴더에 생성해 놨다면 이 2개의 파일들도 tar로 묶여야 합니다. tar로 묶인 결과를 tarball이라고 합니다.
실제 tarbal를 생성하기 위해 다음 명령을 수행합니다.
npm pack
그럼 your-npm-id-my-libary-1.0.0.tgz 파일이 생성됩니다.
your-npm-id-my-libary-1.0.0.tgz 파일을 npm에 배포하기에 앞서 이 파일로 라이브러리가 제대로 설치 되는지 확인하기 위해 새로운 프로젝트 풀더를 다음 절차를 참고하여 생성합니다.
mkdir -p ~/dev/my-libary-consumer cd ~/dev/my-libary-consumer npm init -y npm install ../your-npm-id-my-libary-1.0.0.tgz
index.js 파일을 생성하고 다음 코드를 입력합니다.
const { add } = require("@YOUR_NPM_ID/my-libary");
console.log(add(10, 20));
다음 명령으로 코드가 정상적으로 실행되는지 확인합니다.
node index.js
이제 npm 사이트에 배포하기 위해 npm에 로그인합니다. 라이브러리 프로젝트에서 다음 명령을 실행합니다.
cd ~/dev/my-libary npm login npm whoami
자신의 npm ID가 출력되어야 합니다. 배포하기에 앞서 my-libary가 등록된적이 있는지 확인하기 위해 다음 명령을 실행합니다.
npm view @YOUR_NPM_ID/my-libary version
등록한 적이 없으므로 404 오류가 나와야 합니다.
실제 배포하기에 앞서 다시 한번 더 검증하고 배포합니다.
npm run check npm pack --dry-run npm publish --access public
이제 라이브러리를 테스트하기 위한 폴더에서 다음처럼 npm 사이트로부터 라이브러리를 설치해 테스트해 봅니다.
cd ~/dev/my-math-kit-consumer npm uninstall @YOUR_NPM_ID/my-libary npm install @YOUR_NPM_ID/my-libary node index.js
라이브러리가 변경되면 버전업을 하고 다시 npm에 재배포해야 합니다. 다음 절차를 따릅니다.
cd ~/dev/my-math-kit npm version patch npm publish
위의 경우 버전업 레벨이 patch입니다. 다음을 참고하여 버전업 합니다.
- patch: 버그 수정 (1.0.0 → 1.0.1)
- minor: 하위 호환되는 기능 추가 (1.0.0 → 1.1.0)
- major: 호환성을 깨는 변경 (1.0.0 → 2.0.0)
이제 라이브러리를 테스트하기 위한 폴더에서 다음처럼 npm 사이트로부터 라이브러리를 업데이트해 테스트해 봅니다.
cd ~/dev/my-libary npm update @YOUR_NPM_ID/my-libary npm list @YOUR_NPM_ID/my-libary
라이브러리가 변경되면 이를 tarball로 묶고 테스트하는 프로젝트에서 tarball을 설치(npm을 통해서든, 파일을 통해서든)하는 것은 매우 번거롭습니다. 이 경우 npm link를 통해 쉽게 해결할 수 있습니다.
라이브러리 폴더에서 다음 명령을 수행합니다.
cd ~/dev/my-libary npm run build npm link
그리고 테스트 폴더에서는 다음 명령을 입력합니다.
cd ~/dev/my-libary npm link @YOUR_NPM_ID/my-libary
라이브러리를 link 방식이 아닌 tarball로 설치하고 싶다면 링크를 해제해야 합니다. 방법은 아래와 같습니다.
cd ~/dev/my-libary npm unlink @YOUR_NPM_ID/my-libary
