콘텐츠로 이동

Node + tsx 환경에서 "__name is not a function" 크래시 해결하기

개발 환경을 개선하려고 실행 스크립트를 바꿨는데, 갑자기 잘 돌아가던 코드가 시작부터 멈춰버리면 정말 당황스럽죠. 특히 런타임이나 로더를 변경한 직후에 발생하는 알 수 없는 에러는 개발 흐름을 툭 끊어버리곤 해요.

분명 어제까지는 문제없던 코드가 실행 도구 하나 바꿨다고 작동하지 않는 상황, 많은 개발자가 겪는 공통적인 고충이에요. 이번에는 Node.js 환경에서 tsx를 사용할 때 나타나는 특정 크래시 현상을 살펴볼게요.

  • Node.js (v25.x 또는 v22.22.0)
  • tsx (4.21.0)
  • pnpm

문제를 재현하고 현재 상태를 확인하는 가장 빠른 방법이에요.

  1. 의존성을 설치하고 Node 버전을 확인하세요.

    Terminal window
    node --version
    pnpm install
  2. tsx를 이용해 CLI를 실행해 보세요.

    Terminal window
    node --import tsx src/entry.ts status
  3. 또는 저장소에 포함된 최소 재현 스크립트를 실행할 수 있어요.

    Terminal window
    node --import tsx scripts/repro/tsx-name-repro.ts

TypeError: __name is not a function 발생

섹션 제목: “TypeError: __name is not a function 발생”

tsx로 실행 시 다음과 같은 에러 로그와 함께 프로세스가 종료될 수 있어요.

[openclaw] Failed to start CLI: TypeError: __name is not a function
at createSubsystemLogger (.../src/logging/subsystem.ts:203:25)
at .../src/agents/auth-profiles/constants.ts:25:20

원인 tsx는 내부적으로 esbuild를 사용해 파일을 변환해요. 이때 esbuild의 keepNames 옵션이 __name이라는 헬퍼 함수를 생성하고 함수 정의를 이 함수로 감싸게 되는데, Node 25 로더 경로에서 이 헬퍼가 누락되거나 다른 값으로 덮어씌워지면서 함수가 아니라는 에러가 발생해요.

해결 방법 1: Bun 사용 (임시 복구) 이 문제가 해결되기 전까지는 tsx 대신 Bun을 사용하여 스크립트를 실행하세요. 이전에 Bun 환경에서 문제없이 작동했던 경로로 되돌리는 방법이에요.

해결 방법 2: tsc 컴파일 후 Node로 실행 tsx의 로더 이슈를 피하기 위해 직접 컴파일하는 방식이에요. 로컬에서 정상 작동이 확인된 방법이에요.

Terminal window
pnpm exec tsc -p tsconfig.json
node openclaw.mjs status

해결 방법 3: Watch 모드 적용 개발 중 코드 변화를 계속 감지해야 한다면 아래 명령어를 사용하세요.

Terminal window
pnpm exec tsc --watch --preserveWatchOutput
node --watch openclaw.mjs status

궁금한 점이 더 있다면 AI Setup Assistant에 물어보세요.

OpenClaw

OpenClaw Expert

아직 막혀 있나요?

이 문서에서 답을 못 찾았다면 OpenClaw Expert에게 바로 물어보세요.