인프런 커뮤니티 질문&답변

모락님의 프로필 이미지
모락

작성한 질문수

테스트 with Jest: 제로초에게 제대로 배우기

타입스크립트 세팅

TS로 변경 시 "type": "module" 제거 이유가 궁금합니다.

작성

·

29

0

확장자를 TS로 변경했을 때 코드에는 ESM의 import, export를 사용했는데 왜 package.json파일의 ESM 관련 옵션인 "type": "module"을 제거하는지 궁금합니다.

 

GPT의 답변에 의하면

  • TS 파일은 컴파일 과정에서 CommonJS나 ESM이나 알맞게 변환을 하기 때문에 해당 옵션이 필요 없고, Jest와의 호환성을 위해 "type": "module"을 제거해주는 것이고,

  • JS파일은 기본적으로 CommonJS모듈 시스템을 사용하기 때문에 import문을 사용했으면 ESM방식으로 해석하도록 명시하기 위해서 "type": "module"을 추가한다.

라고 설명을 해주는데 그럼 JS 파일의 경우 Jest와의 호환성을 고려하지 않는건지..

이해가 잘 되지 않습니다. 혹시 설명을 해주실 수 있을까요?

답변 1

0

안녕하세요, 인프런 AI 인턴입니다.
모락님께서 질문하신 내용에 대해서 설명드리겠습니다.

TypeScript 파일(.ts)은 TS 컴파일러에 의해 JavaScript로 변환됩니다. 이 과정에서 모듈 시스템(CommonJS 또는 ESM)이 지정될 수 있으며, 일반적으로 tsconfig.json 파일에서 설정할 수 있습니다. 그렇기 때문에 TypeScript 파일에서는 package.json"type": "module" 옵션이 필수적이지 않을 수 있습니다.

Jest와 관련하여 "type": "module"을 삭제하는 이유는 Jest의 기본 모듈 시스템이 CommonJS이기 때문입니다. Jest와 ESM 모듈과의 호환성 문제 때문에 TS의 경우 CommonJS로 설정하는 경우가 많고, 따라서 "type": "module"을 제거해 Jest와의 호환성을 높이는 것입니다.

JS 파일의 경우 기본적으로 CommonJS 모듈을 사용합니다. JS 파일에서 ESM 방식의 import, export를 사용하려면 "type": "module"을 추가해 ESM 방식으로 해석하도록 명시합니다.

하지만 Jest가 ESM을 지원하기 위해 추가 설정이 필요로 할 수 있기 때문에 호환성 문제를 피하려고 CommonJS 사용을 유지하는 경우가 많습니다.

즉, TS 파일의 경우 컴파일 과정에서 CommonJS로 변환하는 것이 보통이기 때문에 "type": "module"이 필요 없으며, ESM을 지원하는 Jest 설정이 번거롭기 때문에 이러한 설정을 채택합니다.

더 궁금한 점이 있으시면 언제든지 질문해 주세요!
Spring Data 자체 ESM/Jackson 지원 참고 자료도 도움이 될 수 있습니다.
감사합니다.

모락님의 프로필 이미지
모락

작성한 질문수

질문하기