기본적으로 타입스크립트는 자바스크립트 파일로 변환해야 NodeJS로 실행이 가능하지만 ts-node
로 직접적인 변환 과정을 생략할 수 있다.
npm install -D ts-node
npx ts-node ./scripts/the-file-you-want-to-execute.ts
TypeScript 설정이 명시되어있는 tsconfig.json
에서 ts-node
관련 설정만 추가해주면 모듈 에러 없이 실행이 가능했다.
module
속성으로 CommonJS
를 명시해서 외부 모듈이 필요할 때 NodeJS에서 호환 가능한 require
를 호출하도록 할 수 있다.
target
은 타입스크립트가 어떤 버전의 자바스크립트 파일로 변환할지 명시한다. ES6이라 적혀있어도 require
또한 호환되도록 컴파일된다.
{
"ts-node": {
"compilerOptions": {
"target": "ES6",
"module": "CommonJS",
"moduleResolution": "node"
},
"esm": true
}
}
몇몇 프로젝트에서는 package.json
에 "type": "module"
이 작성되어있는데 이때 ts-node
가 작동하지 않는 경우가 많았다. 자주 마주친 에러는 'ERR_UNKNOWN_FILE_EXTENSION'
로 인터넷 검색 결과 여러 사람들이 이 에러를 마주치고 있는 것으로 보였다.
해결책
ts-node
를 직접적으로 호출하지 않고 node 명령어에 loader
옵션을 추가함으로써 타입스크립트 파일을 컴파일 없이 실행시킬 수 있다.
ESM Loader를 사용하기 때문에 tsconfig.json
의 module
옵션을 ES 모듈을 지원하는 버전으로 바꿔줄 필요가 있다.
{
"compilerOptions": {
"lib": ["DOM", "DOM.Iterable", "ESNext"],
"target": "ES6",
"module": "ES6",
"moduleResolution": "Node"
}
}
npm install -D ts-node
node --loader ts-node/esm ./scripts/the-file-you-want-to-execute.ts
실행할 때 경고문이 출력되지 않게 하려면 옵션을 더 추가하면 된다.
node --no-warnings --loader ts-node/esm ./scripts/the-file-you-want-to-execute.ts