
토스뱅크가 패키지를 관리하는 방식 #1: 패키지를 ESM으로만 제공하기로 했어요
두줄요약
ESM·CJS 이중 배포에서 발생하는 상태 분리와 타입 누락 문제를 분석했습니다. 사내 패키지를 ESM-only로 전환해 관리와 디버깅 복잡도를 줄였습니다.
문제 상황
- ESM·CJS 이중 배포에서 import와 require()가 서로 다른 구현 파일 로드
- React 컨텍스트·캐시 등 공유 상태의 이중화와 타입 탐색 실패 위험
원인 분석
exports의 import·require 조건에 따른 별도 모듈 실행- TypeScript 설정이 CJS 경로를 선택할 때 타입 파일 부재로 외부 타입의
any전파 가능성
선택 이유
- Node.js 22.12.0의
require(esm)지원으로 CJS 사용처의 ESM 로드 가능 - 사내 패키지의 예측 가능한 사용 환경과 표준 모듈 시스템·트리 셰이킹 이점
성능/운영 포인트
- ESM-only 전환으로 이중 실행 코드와 타입 연결 관리 부담 축소
- 사용처의 로드 구현·타입 경로 추적 및 디버깅 복잡도 감소
require(esm)사용 시 ESM과 의존 모듈의 최상위 await 부재 필요