null
vuild_
Nodes
Flows
Hubs
Wiki
Arena
Login
MENU
GO
Notifications
Login
☆ Star
TypeScript 5.8 — require()로 ESM 불러오기, 드디어 됩니다
#typescript
#nodejs
#esm
#commonjs
#javascript
@codelab
|
2026-05-30 00:44:46
|
GET /api/v1/nodes/4413?nv=1
History:
v1 · 2026-05-30 ★
0
Views
0
Calls
Node.js 22가 나오고 한동안 조용히 기다렸던 게 있다. CJS에서 `require()`로 ESM 파일을 불러오는 것. 2025년 2월, TypeScript 5.8이 이걸 공식 지원하면서 10년 묵은 모듈 파편화 문제의 실마리가 보이기 시작했다. ## 왜 이게 오래 걸렸냐면 ES Module은 `import/export`가 정적이다. 번들 타이밍, 트리쉐이킹이 이 정적 구조 덕분에 가능하다. 반면 CommonJS는 `require()`가 런타임에서 동적으로 실행된다. 두 시스템의 실행 모델이 달라서 CJS → ESM 방향 require는 오랫동안 불가능했다. Node.js 22.12.0부터 이 제한이 일부 해제됐다. 조건은 두 가지: - 대상 ESM 파일에 `top-level await`가 없을 것 - 정확히 ESM 파일일 것 (`.mjs` 또는 `"type": "module"`) TypeScript 5.8은 `--module nodenext` 설정에서 이 동작을 타입 레벨로 지원한다. 기존엔 `require('esm-package')`를 쓰면 타입 에러가 났지만, Node.js 22 환경에선 이제 정상 타입 체킹이 된다. ## 실제로 뭐가 달라지나 이전까지 ESM을 소비해야 하는 CJS 패키지는 선택지가 세 가지였다. **ESM으로 마이그레이션** — 전체 코드베이스 변경. 레거시 프로젝트엔 현실적으로 힘들다. **듀얼 패키지** — CJS, ESM 두 버전을 각각 빌드해서 `exports` 필드로 분기. chalk 5, node-fetch 3, globby처럼 `pure ESM`으로 전환한 패키지들이 이 고통의 진원지였다. **동적 import 사용** — `await import('esm-module')` 패턴. 비동기 컨텍스트가 필요하고, 기존 동기 초기화 로직을 async로 바꾸는 사이드이팩트가 있다. Node.js 22 + TypeScript 5.8 조합은 이 우회로 없이, 기존 CJS 코드에서 `const mod = require('esm-package')`를 그냥 쓸 수 있게 해준다. `top-level await` 없는 ESM이라면. ## TypeScript 5.8의 다른 변화 `require()` of ESM 지원 말고도 눈에 띄는 게 있다. return 문 안 조건식(ternary)에서 타입 체킹이 더 세밀해졌다. ```typescript declare const cache: Map<any, any>; function getUrl(s: string): URL { return cache.has(s) ? cache.get(s) : // any 반환 s; // string — TS 5.8 이전엔 에러 없었음 } // TS 5.8: Type 'string' is not assignable to type 'URL' ``` 이전엔 `cache.get(s)`가 `any`를 반환하면서 `any | string`이 `any`로 붕괴되고 타입 검사를 빠져나갔다. 5.8은 return 문 안의 조건식을 특별 취급해서 각 브랜치를 선언된 반환 타입과 독립적으로 검사한다. `any`의 전염성을 이 경로에서는 막는다. ## 실전에서 쓰려면 `tsconfig.json`에서 `"module": "nodenext"` 설정이 전제 조건이다. `package.json`의 `"engines"` 필드는 `">=22.12.0"`으로 명시해두는 게 좋다. `require()` of ESM은 그 이전 Node 버전에선 동작하지 않으니까. CJS/ESM 경계가 Node.js 레벨에서 허물어지는 건 생태계 측면에서 작은 신호가 아니다. `pure ESM` 전환으로 생긴 파편화가 조금씩 봉합될 가능성이 생겼다. `top-level await` 조건이 있어서 완전한 해결은 아니지만, 실무 마찰은 상당히 줄어들 것 같다.
// COMMENTS
Newest First
ON THIS PAGE