Unknown file extension ".ts" for server.ts

잭슨·2024년 5월 28일
0

삽질

목록 보기
1/2

사이드 프로젝트로 블로그를 만들던 중이었다.

프론트는 얼추 형태가 잡혀서 백을 개발하기 위해 루트 폴더 아래에 backend 폴더를 따로 만들어서 이 안에 server.ts파일을 만들었다.

server는 express를 이용해서 만들었다.

그리고 ts-node로 서버를 실행시키려는데, 아래와 같은 에러가 발생했다.

분명 원래는 잘 실행됐었는데 server.ts 파일을 backend 폴더로 이동시키고 나니까 이런 메세지가 발생했다.

찾아보니 이와 같은 증상을 겪는 사람들이 많았고, 해결 방안도 다양했다.

방법 1

https://stackoverflow.com/questions/62096269/cant-run-my-node-js-typescript-project-typeerror-err-unknown-file-extension

처음엔 체택된 답변에 있는 내용을 참고했다.
하지만 "type": "module"을 제거하면 기본적으로 node.js는 CJS방식을 지원하기 때문에 기존에 ES모듈 방식으로 작성된 import문을 CJS 방식인 require로 수정해줘야 하기 때문에 문제가 되었다.

그래서"type": "module"을 제거하는 방식 대신에 그 밑에 있는 tsconfig.json 파일을 수정하는 방식을 시도해보았다.

tsconfig.json

{
  "compilerOptions": {
    "esModuleInterop": true,
  }
}

그리고 CLI 명령어도 바꿔서 해봤지만 여전히 에러가 발생했다.

방법 2

같은 질문인데 그 위에 최근에 올라온 답변이 있었다.

답변 내용은 ts-node 대신 tsx를 사용하라는 얘기였다.

나는 이 방법으로 해결됐다.

하지만 다른 방법은 없는지 더 알아보고 싶었다.

방법 3

https://github.com/TypeStrong/ts-node/issues/1997

tsconfig.json 파일에 { "ts-node": { "esm": true } }를 추가하고 아래 명령어를 CLI에 실행해봤다.

node --loader ts-node/esm {파일명}.ts

이 방식은 npm ts-node 공식 페이지에서도 알려주는 방식이다.

https://www.npmjs.com/package/ts-node#commonjs-vs-native-ecmascript-modules

댓글들을 보면 이 방법으로 해결이 되는 사람들도 있고 해결되지 않는 사람들도 있는것 같던데 나는 아래와 같은 에러가 떴다.

vite-node를 사용하면 해결된다는 댓글도 있다.

그래서 따라해보니 npm을 vite-node를 설치하고 실행해보니 정상적으로 동작한다.

현재까지 ts-node는 아직 이 문제를 해결하지 못한듯 보인다.

결론

tsx 혹은 vite-node 사용하자.

두 패키지의 차이점은 tsx는 ES module 방식으로만 코드를 작성해야 에러 없이 실행되고, vite-node는 ES module과 CommonJS 방식을 혼합해서 사용해도 에러가 발생하지 않는다는 차이가 있다.

profile
지속적인 성장

0개의 댓글