피드로 돌아가기
GeekNewsBackend
원문 읽기
JavaScript 비대화의 세 가지 축
npm 생태계의 의존성 비대화가 구형 런타임 지원, 원자적 패키지 구조, 불필요한 ponyfill 유지로 인해 전체 개발자에게 다운로드·유지보수 비용 강요
AI 요약
Context
npm 의존성 트리가 세 가지 구조적 원인으로 비대화되었다: ES3/IE6 지원, 1줄 코드 단위 패키지 분리, 이미 모든 엔진이 지원하는 기능의 ponyfill 유지. 일부 구형 환경만을 위해 설계된 패키지들(is-string, hasown 등)이 현대 개발자 대다수의 의존성 트리에 포함되어 불필요한 비용을 초래한다.
Technical Solution
- 오래된 런타임 지원 제거: primordials 기반 cross-realm 안전성과 ES3 호환성을 이유로 유지되는 math-intrinsics, is-string 같은 패키지를 모든 LTS 엔진이 해당 기능을 지원하면 제거
- 원자적 아키텍처 인라인화: shebang-regex(1줄), arrify(단순 배열 변환), onetime 같이 단일 소비자만 갖는 마이크로 패키지를 직접 코드에 포함해 npm 요청·압축 해제 비용 제거
- 불필요한 ponyfill 제거: globalthis(2019년 지원, 주간 4,900만 다운로드), object.entries(2017년 지원, 주간 3,500만 다운로드) 같이 네이티브 구현이 가능한 ponyfill 패키지 자동 감지 및 제거
- 의존성 트리 시각화 및 정리: npmgraph.js.org로 고립된 의존성 브랜치 식별(예: eslint@10.1.0의 find-up 브랜치 6개 패키지) 후 empathic 같은 더 작은 대안으로 마이그레이션
- 자동 마이그레이션 도구 활용: @e18e/cli analyze로 대체 가능한 의존성 자동 탐지(예: chalk → picocolors) 및 module-replacements 프로젝트 기반 codemod 적용
Key Takeaway
JS 생태계의 비대화는 기술 문제가 아닌 구조적 관성이다: 소수의 구형 호환성 요구가 전체 개발자의 빌드 비용·보안 표면·유지보수 부담으로 전가되고 있으며, knip, e18e, module-replacements 같은 도구와 커뮤니티 협력을 통해서만 정리가 가능하다.
실천 포인트
Node.js 및 현대 브라우저를 대상으로 하는 프로젝트에서 knip으로 사용되지 않는 의존성을 감지하고, @e18e/cli analyze로 구형 호환성 패키지의 네이티브 대체재를 찾은 뒤, 1~2줄 코드 패키지는 인라인으로 변경하면 lockfile 크기 감소, 버전 충돌 제거, 공급망 보안 표면 축소를 동시에 달성할 수 있다.