ts-node
ts-node는 명령행에서 직접 TypeScript 코드를 실행할 수 있는 패키지이다.
일반적으로 개발 환경에서 사용되며, 먼저 자바스크립트로 변환하는 과정을 거치지 않고도 빠르게 TypeScript 코드를 테스트할 수 있다.
설치
ts-node를 사용하려면 먼저 ts-node와 TypeScript 컴파일러를 설치해야 한다.
npm i -g ts-node typescript
사용
ts-node와 TypeScript 컴파일러가 설치되면 ts-node 명령을 사용하여 명령행에서 직접 TypeScript 코드를 실행할 수 있다.
ts-node app.ts
사용 예시
에러
만약 실행하는데 아래와 같은 에러가 나는 경우 1
D:\\typeScript\\basic-ts-practice\\src\\test>ts-node test.ts
(node:10936) Warning: To load an ES module, set "type": "module" in the package.json or use the .mjs extension.
(Use `node --trace-warnings ...` to show where the warning was created)
D:\\typeScript\\basic-ts-practice\\src\\test\\test.ts:8
export {};
^^^^^^
SyntaxError: Unexpected token 'export'
at Object.compileFunction (node:vm:352:18)
at wrapSafe (node:internal/modules/cjs/loader:1033:15)
at Module._compile (node:internal/modules/cjs/loader:1069:27)
at Module.m._compile (C:\\Users\\songhee\\AppData\\Roaming\\npm\\node_modules\\ts-node\\src\\index.ts:1618:23)
at Module._extensions..js (node:internal/modules/cjs/loader:1159:10)
at Object.require.extensions.<computed> [as .ts] (C:\\Users\\songhee\\AppData\\Roaming\\npm\\node_modules\\ts-node\\src\\index.ts:1621:12)
at Module.load (node:internal/modules/cjs/loader:981:32)
at Function.Module._load (node:internal/modules/cjs/loader:822:12)
at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:77:12)
at phase4 (C:\\Users\\songhee\\AppData\\Roaming\\npm\\node_modules\\ts-node\\src\\bin.ts:649:14)
모듈 시스템 확인
TypeScript는 기본적으로 ES6 모듈을 사용한다.
따라서, tsconfig.json 파일에서 module 설정이 CommonJS로 되어 있어야 한다.
ts-node는 Node.js 환경에서 실행되므로, Node.js가 이해할 수 있는 CommonJS 모듈 시스템을 사용해야 한다.
//tsconfig.json
{
"compilerOptions": {
"module": "CommonJS",
...
}
}
만약 실행하는데 아래와 같은 에러가 나는 경우 2
D:\typeScript\basic-ts-practice2\src\test>ts-node test.ts
C:\Users\songhee\AppData\Roaming\npm\node_modules\ts-node\src\index.ts:859
return new TSError(diagnosticText, diagnosticCodes, diagnostics);
^
TSError: ⨯ Unable to compile TypeScript:
test.ts:1:1 - error TS1208: 'test.ts' cannot be compiled under '--isolatedModules' because it is considered a global script file. Add an import, export, or an empty 'export {}' statement to make it a module.
1 class MyClass {
~~~~~
at createTSError (C:\Users\songhee\AppData\Roaming\npm\node_modules\ts-node\src\index.ts:859:12)
at reportTSError (C:\Users\songhee\AppData\Roaming\npm\node_modules\ts-node\src\index.ts:863:19)
at getOutput (C:\Users\songhee\AppData\Roaming\npm\node_modules\ts-node\src\index.ts:1077:36)
at Object.compile (C:\Users\songhee\AppData\Roaming\npm\node_modules\ts-node\src\index.ts:1433:41)
at Module.m._compile (C:\Users\songhee\AppData\Roaming\npm\node_modules\ts-node\src\index.ts:1617:30)
at Module._extensions..js (node:internal/modules/cjs/loader:1159:10)
at Object.require.extensions.<computed> [as .ts] (C:\Users\songhee\AppData\Roaming\npm\node_modules\ts-node\src\index.ts:1621:12)
at Module.load (node:internal/modules/cjs/loader:981:32)
at Function.Module._load (node:internal/modules/cjs/loader:822:12)
at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:77:12) {
diagnosticCodes: [ 1208 ]
}
isolatedModules 확인
{
"compilerOptions": {
...
"isolatedModules": false,
...
},
}
tsconfig 설정에서 isolatedModules는 각 TypeScript 파일을 모듈로 간주하도록 컴파일러에게 지시하는 옵션이다.
이 옵션은 다음과 같은 영향을 미친다.
모듈 시스템 강제
- 모든 파일은 import 또는 export를 사용해야 한다.
- export {}를 사용하여 '빈 모듈'을 만들 수도 있다.
- 전역 네임스페이스에 변수 또는 함수를 선언할 수 없다.
모듈 경계 강화:
- 각 파일은 자체 모듈 범위를 가지며 다른 파일과 직접 변수 또는 함수를 공유할 수 없다.
- 공유하려면 export를 사용해야함
단일 파일 컴파일:
- 각 파일은 단독으로 컴파일될 수 있으며 다른 파일의 종속성이 필요하지 않는다.
주의 사항:
- isolatedModules를 true로 설정하면 프로젝트 구조와 코드 작성 방식에 영향을 미칠 수 있음
- 기존 코드를 변경해야 할 수도 있음
사용 예시:
- 모듈 시스템을 사용하여 코드를 더 잘 구성하고 관리하려는 경우
- 코드를 단일 파일로 컴파일해야 하는 경우
- 코드의 모듈 경계를 강화하여 더 나은 추상화와 재사용성을 얻고 싶은 경우
'타입스크립트' 카테고리의 다른 글
타입스크립트 interface 인덱서블 타입 (0) | 2024.03.12 |
---|---|
타입스크립트란? (0) | 2024.03.10 |
타입스크립트 declare 사용법 (0) | 2024.03.01 |
타입스크립트 타입 (0) | 2023.08.30 |
타입스크립트에서 axios API 제네릭으로 타입 넣어주기 (0) | 2023.08.26 |
ts-node로 타입스크립트 파일 바로 실행