Watch at Ease세상을 읽고, 일상의 답을 찾다.

기술 · 실용 가이드

Node ERR_REQUIRE_ESM인가요? 모듈 설정 전에 런타임 호출자를 추적하세요

소스가 import를 써도 출력 JavaScript, 의존성, 테스트 러너가 require()를 호출할 수 있습니다. 런타임 경계를 증명한 뒤 ESM 전환, 동적 import, 검토된 임시 버전 고정을 선택하세요.

소스와 빌드 출력, 패키지 정보에서 Node 런타임까지 추적하는 원본 기술 일러스트.
원본 일러스트: 전역 설정 변경 전에 실행 경로를 추적하세요. Watch at Ease

ERR_REQUIRE_ESM은 런타임 모듈 형식 경계를 가리킵니다. TypeScript, Babel, Vite, Electron, Jest 또는 전이 의존성이 require()를 만들 수 있어 실행된 줄은 소스와 다를 수 있습니다.

첫 스택, 정확한 Node 버전과 실행 JavaScript를 보존한 뒤 package.json을 바꾸세요.

런타임 증거 먼저 보존

스택, 명령, 작업 디렉터리, Node/패키지 관리자 버전과 lockfile을 저장하고 대상 ESM과 첫 애플리케이션 호출자를 표시합니다.

node_modules나 lockfile을 먼저 지우면 실패한 그래프와 경계가 사라집니다.

실제로 실행된 출력 검사

dist, out, build, Electron bundle의 호출 줄이 require()인지 확인합니다.

TypeScript module, moduleResolution, 확장자와 가장 가까운 package.json type을 기록합니다.

패키지 경계와 소유자 매핑

lockfile과 의존성 트리로 버전을 확정하고 호출이 내 코드, 직접 또는 전이 의존성 소유인지 분류합니다.

Node 버전도 기록합니다. 런타임 회귀와 top-level await는 일반 ESM-only 업그레이드와 다릅니다.

한 가지 수리 경로 선택

일관되게 전환할 수 있으면 경계, 출력, 상대 확장자와 진입점을 함께 바꿉니다. CommonJS 유지 시 비동기화 가능한 소유 경계에 dynamic import를 둡니다.

의존성 내부라면 지원되는 상위 버전을 우선하고, 임시 고정에는 이유·위험·제거일을 남깁니다.

같은 경계에서 검증

오래된 출력을 지우고 다시 빌드하되 lockfile을 뜻밖에 바꾸지 말고 require 제거 또는 올바른 export를 확인합니다.

같은 Node 버전으로 원래 명령, 테스트, 운영 진입점을 실행하고 의존성 트리와 출력 조각을 저장합니다.

세 가지 수리 경로가 검증 결과로 합쳐지는 원본 기술 일러스트.
원본 일러스트: 경계를 증명한 뒤 전환, 브리지 또는 고정을 선택하세요. Watch at Ease