사이드 프로젝트로 블로그를 만들던 중이었다.
프론트는 얼추 형태가 잡혀서 백을 개발하기 위해 루트 폴더 아래에 backend 폴더를 따로 만들어서 이 안에 server.ts파일을 만들었다.
server는 express를 이용해서 만들었다.
그리고 ts-node
로 서버를 실행시키려는데, 아래와 같은 에러가 발생했다.
분명 원래는 잘 실행됐었는데 server.ts 파일을 backend 폴더로 이동시키고 나니까 이런 메세지가 발생했다.
찾아보니 이와 같은 증상을 겪는 사람들이 많았고, 해결 방안도 다양했다.
처음엔 체택된 답변에 있는 내용을 참고했다.
하지만 "type": "module"
을 제거하면 기본적으로 node.js는 CJS방식을 지원하기 때문에 기존에 ES모듈 방식으로 작성된 import문을 CJS 방식인 require로 수정해줘야 하기 때문에 문제가 되었다.
그래서"type": "module"
을 제거하는 방식 대신에 그 밑에 있는 tsconfig.json
파일을 수정하는 방식을 시도해보았다.
tsconfig.json
{
"compilerOptions": {
"esModuleInterop": true,
}
}
그리고 CLI 명령어도 바꿔서 해봤지만 여전히 에러가 발생했다.
같은 질문인데 그 위에 최근에 올라온 답변이 있었다.
답변 내용은 ts-node 대신 tsx를 사용하라는 얘기였다.
나는 이 방법으로 해결됐다.
하지만 다른 방법은 없는지 더 알아보고 싶었다.
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 방식을 혼합해서 사용해도 에러가 발생하지 않는다는 차이가 있다.