npm link를 이용하여 로컬에서 서드파티 npm 패키지를 커스터마이징하는 방법을 알아봅시다.
npm link란?
때때로 로컬에 존재하는 다른 프로젝트를 npm 패키지처럼 쓰고 싶은 경우가 있었을 것입니다.
npm link기능을 사용하면 특정 패키지가 다른 프로젝트의 node_modules에 존재하는 것처럼 사용할 수 있습니다.
이를 이용하여 npm dev를 활용한 핫 리로딩 기능을 활용할 수도 있겠죠.
npm link의 마법
여기서부터는 참고 2의 번역입니다.
Node.js에는 매우 간단한 모듈 로딩 전략이 있습니다.
모듈을 require()할 때마다 다음 단계가 순서대로 실행됩니다.
- 노드 코어(core) 모듈인 경우 코어 모듈을 로드합니다.
- 상대 경로인 경우 상대 경로에서 모듈을 로드합니다.
- ./node_modules 디렉토리에서 모듈을 찾습니다.
- 만약 해당 디렉토리에 없으면, 파일 시스템의 루트에 도달할 때까지 상위 디렉토리의 ./node_modules에서 재귀적으로 검색합니다.
로컬 모듈 로딩하기
1. 컴퓨터에 npm 모듈을 생성(또는 다운로드)합니다.
cd ~/Desktop
git clone git@github.com:klughammer/node-randomstring.git
2. 모듈의 루트 폴더 내에서 npm 링크를 실행합니다.
cd ~/Desktop/node-randomstring
npm link
3. 다른 디렉터리에서 npm link <module_name>을 실행합니다.
mkdir ~/Desktop/my-project
cd ~/Desktop/my-project
npm link randomstring
4. 이제 프로젝트 내에서 2에서 링크한 모듈을 require할 수 있습니다.
# ~/Desktop/my-project/app.js
const randomstring = require("randomstring");
console.log(randomstring.generate());
# ~/Desktop/node-randomstring/lib/randomstring
exports.generate = function(){
return 4; // chosen by fair dice roll.
// guaranteed to be random.
}
로컬 모듈을 로드할 수 있다는 것은 필요한 모듈을 변경하고 publish / install 주기를 거치지 않고
프로젝트 컨텍스트에서 즉시 테스트하려는 경우 정말 유용합니다.
해당 기능은 어떻게 동작하나요?
1. 글로벌 심볼릭 링크
모듈의 루트 디렉토리에서 npm link를 실행하면
npm은 "global node_modules" 디렉토리에서 -> 로컬 모듈의 디렉토리로 심볼릭 링크를 생성합니다.
“global node_modules” 디렉토리는
npm install -g로 설치된 모든 모듈이 저장되는 특수 디렉토리입니다.
npm root -g를 실행하여 전역 node_modules 디렉토리의 경로를 찾을 수 있습니다.
> ls -al $(npm root -g)
lrwxrwxrwx 1 alexishevia alexishevia 43 Mar 22 21:19
randomstring -> /home/alexishevia/Desktop/node-randomstring
2. 로컬 심볼릭 링크
프로젝트 디렉토리에서 npm link <module_name>을 실행하면
npm이 ./node_modules/<module_name>에서
<global_node_modules>/<module_name>으로의 심볼릭 링크를 생성합니다.
> ls -al ./node_modules
lrwxrwxrwx 1 alexishevia alexishevia 64 Mar 22 21:19
randomstring -> ../../../.nvm/versions/node/v6.9.5/lib/node_modules/randomstring
저는 nvm을 사용하고 있으므로
전역 node_modules 폴더는 /home/alexishevia/.nvm/versions/node/v6.9.5/lib/node_modules입니다.
이게 전부입니다.
마술이 아니라 심볼릭 링크입니다.
보너스
심볼릭 링크를 제거하기만 하면 npn link의 효과를 "취소"할 수 있습니다.
그러나 npm unlink라는 내장 명령이 있습니다.
(주의 : 순서 중요)
먼저 프로젝트 디렉토리에서 npm unlink --no-save <module_name>을 실행하여 로컬 symlink를 제거하고
모듈의 디렉토리에서 npm unlink를 실행하여 전역 symlink를 제거하세요
참고
https://medium.com/dailyjs/how-to-use-npm-link-7375b6219557
https://medium.com/@alexishevia/the-magic-behind-npm-link-d94dcb3a81af
'FrontEnd' 카테고리의 다른 글
Node.JS 앱은 어떻게 종료되는가? (0) | 2023.01.15 |
---|---|
Vue3로 debounce, throttle 구현하기 (0) | 2023.01.13 |
[번역] Commander.js와 Typescript를 이용하여 CLI 만들기 (0) | 2023.01.12 |
[프론트엔드 아키텍처] 모노레포 1분만에 이해하기 + 터보레포 (0) | 2023.01.11 |
Vue3 리렌더링 최적화 with ComputedEager (0) | 2023.01.10 |