npm
Build amazing things with npm.
— npm 공식 홈페이지 메인 슬로건
남이 만든 패키지 1000개를 뒤섞어 만든 누더기 골렘 위에서 아슬아슬하게 외줄 타기하는 현대 프론트엔드 생태계의 현실. 아무 생각 없이 npm install 쳤다가 맥북이 이륙을 시도하고 있습니다
1. 개요
Node.js의 기본 패키지 관리자(Package Manager)이자, 세계에서 가장 거대하고 역동적인 자바스크립트 패키지 레지스트리이다. 과거 HTML 파일에 <script> 태그를 구질구질하게 붙여 제이쿼리를 연동하던 웹 브라우저 개발 패러다임을 완전히 무너뜨리고, 모던 웹 프론트엔드 빌드 도구와 모듈식 개발의 시대를 활짝 열었다. 하지만 그 뒤편에는 수백 메가바이트짜리 node_modules라는 전설적인 블랙홀 폴더가 도사리고 있다.(...)
2. node_modules: 우주에서 가장 무거운 물체
새로운 리액트 프로젝트를 만들고 npm install을 실행하는 순간, 눈에 보이지 않는 거대한 중력 붕괴가 하드디스크에서 일어난다. 단 하나의 라이브러리를 설치했을 뿐인데 그 라이브러리가 의존하는 다른 라이브러리, 그리고 그 녀석들이 의존하는 수천 개의 패키지들이 꼬리에 꼬리를 물고 다운로드되어 node_modules 폴더 안에 처박힌다.1 결국 파일 개수가 수만 개를 넘어가며 단순 삭제를 하려 해도 운영체제가 버벅거리는 대참사가 종종 발생한다.
3. Left-pad 사태와 의존성 보안 위기: 사상 초유의 파국
전 세계의 수많은 대기업들이 npm의 공용 패키지에 얼마나 허술하게 기대어 있는지가 단 한 번의 사건으로 증명된 바 있다. 자바스크립트 개발자들은 아주 극단적인 모듈화를 선호한 나머지, '문자열 왼쪽에 공백을 채워넣는 11줄짜리 코드'마저 패키지로 배포하여 서로 참조하고 있었고, 이 패키지가 삭제되자 전 세계의 빌드 파이프라인이 즉시 마비되었다.(...) 이로 인해 현대 웹은 언제 무너질지 모르는 사상누각과도 같다는 비판이 늘 뒤따른다.
4. 관련 밈 및 드립
4.1. 우주에서 가장 무거운 물체 (Heaviest Objects in the Universe)
블랙홀, 중성자별, 태양 등 우주에서 질량이 무시무시한 천체들을 나열하다가 마지막에 압도적인 1위로 'node_modules' 폴더 아이콘을 배치하는 전설적인 짤방이다. 물리적인 질량은 0에 수렴하지만, 윈도우 파일 탐색기로 용량을 확인할 때 올라가는 파일 카운트를 보고 있으면 절로 고개가 끄덕여지는 명작이다.
4.2. is-odd / is-even 아키텍처
어떤 숫자가 홀수인지 판별해 주는 is-odd 패키지가 존재하는데, 정작 이 패키지는 짝수인지 판별해 주는 is-even 패키지에 의존하고, 이 패키지는 또 다른 원초적 타입 검사 라이브러리에 의존하는 자바스크립트 특유의 극단적 조각화를 풍자하는 밈이다. 이 간단한 조건식 하나를 직접 안 짜고 패키지를 임포트하여 쓰기 때문에 npm의 비대화가 가속화된다.
5. 여담
- Yarn과 pnpm의 반란: npm의 처참한 다운로드 속도와 디스크 낭비에 빡친 페이스북이 Yarn을, 하드링크 방식으로 용량을 획기적으로 절약하는 pnpm이 등장하며 삼국지를 형성했다.
- 패키지 이름 도용 및 스쿼팅: 힙하고 예쁜 패키지 이름은 10년 전 고인물들이 이미 먹어놓았기 때문에, 어쩔 수 없이 내 패키지 명칭 뒤에
-new,-final,-v2같은 오열 섞인 접미사를 붙이는 개발자들이 수두룩하다. - npm audit의 잔소리: 빌드 한 번 돌릴 때마다 '취약점이 241개 발견되었습니다(14개는 심각)'라며 개발자에게 심리적 위협을 가하지만, 대다수의 개발자들은 어차피 고칠 엄두를 못 내고 조용히 눈을 감아버린다.