node.js - Cum să rulezi fișiere TypeScript din linia de comandă?
Am dificultăți surprinzătoare în a găsi un răspuns la asta. Cu Node.JS simplu, poți rula orice fișier js cu node path/to/file.js, cu CoffeeScript este coffee hello.coffee și ES6 are babel-node hello.js. Cum fac același lucru cu Typescript?
Proiectul meu are un tsconfig.json care este folosit de Webpack/ts-loader pentru a construi un mic bundle pentru browser. Totuși, am nevoie de un pas de build care să ruleze din consolă înainte de asta, care ar folosi unele dintre fișierele .ts folosite în proiect pentru a genera un schemă, dar nu reușesc să rulez un singur fișier Typescript fără a compila întregul proiect.
Răspuns #1
Poți lăsa tsc să ruleze în modul de monitorizare folosind tsc -w -p . și va genera fișiere .js pentru tine în timp real, astfel încât să poți rula node foo.js ca de obicei.
Pentru a rula un singur fișier TypeScript fără a compila întregul proiect, există ts-node care va compila codul din mers și îl va rula prin Node:
npx ts-node src/foo.ts
Răspunsul #2
Rulați comenzile de mai jos și instalați pachetele necesare global:
npm install -g ts-node typescript '@types/node'
Acum rulează următoarea comandă pentru a executa un fișier TypeScript:
ts-node typescript-file.ts
Răspunsul #3
De asemenea, poți încerca tsx. tsx este o comandă CLI (alternativă la node) pentru a rula TypeScript fără probleme, este construit pe baza esbuild, așa că este foarte rapid.
https://github.com/esbuild-kit/tsx
Exemplu :
npx tsx ./script.ts
Răspunsul #4
Avem următorii pași:
Mai întâi trebuie să instalezi TypeScript
npm install -g typescriptCreează un fișier helloworld.ts
function hello(person){ return "Hello, " + person; } let user = "Aamod Tiwari"; const result = hello(user); console.log("Result", result)Deschide promptul de comandă și tastează următoarea comandă
tsc helloworld.tsRulează din nou comanda
node helloworld.jsRezultatul va fi afișat în consolă
Răspunsul #5
Pentru a adăuga la răspunsul lui @Aamod de mai sus, dacă vrei să folosești o singură linie de comandă pentru a compila și rula codul tău, poți folosi următoarea:
Windows :
tsc main.ts | node main.js
Linux/macOS:
tsc main.ts && node main.js
Răspuns #6
Am creat @digitak/esrun, un înveliș subțire în jurul esbuild care execută un fișier TypeScript aproape instantaneu. esrun a fost făcut pentru că am fost dezamăgit de ts-node: prea lent și pur și simplu nu funcționa majoritatea timpului.
Avantajele esrun față de ts-node includ:
- foarte rapid (folosește esbuild),
- poate importa ESM precum și CJS (folosește doar bibliotecile pe care le alegi și
esrunva funcționa imediat), - există un mod de vizionare inclus, rulează scriptul tău cu opțiunea
--watchși orice modificare adusă fișierului tău de intrare sau oricăreia dintre dependențele sale va reiniția rezultatul - poți folosi
esrunîn modul de inspectare pentru a folosi consola DevTools în locul consolei terminalului tău.
După instalare, pur și simplu rulează:
npx @digitak/esrun file.ts
Răspuns #7
Editare: mai 2022
ts-node are acum un flag --esm, folosește-l.
Răspuns vechi:
Niciunul dintre celelalte răspunsuri nu discută despre cum să rulezi un script TypeScript care folosește module, și în special modulele ES moderne.
În primul rând, ts-node nu funcționează în acel scenariu, începând cu martie 2020. Așadar, ne vom mulțumi cu tsc urmat de node.
În al doilea rând, TypeScript încă nu poate genera fișiere .mjs. Așadar, ne vom mulțumi cu fișiere .js și "type": "module" în package.json.
În al treilea rând, doriți linii import curate, fără a specifica extensia .js (care ar fi confuză în fișierele .ts):
import { Lib } from './Lib';
Ei bine, asta nu este trivial. Node necesită specificarea extensiilor la importuri, cu excepția cazului în care folosești flag-ul experimental-specifier-resolution=node. În acest caz, ar permite Node să caute Lib.js sau Lib/index.js atunci când specifici doar ./Lib pe linia import.
În al patrulea rând, există totuși o problemă: dacă ai un nume de fișier main diferit de index.js în pachetul tău, Node nu îl va găsi.
Transpilarea face lucrurile mult mai complicate decât rularea Node simplu.
Iată un exemplu de depozit cu o structură modernă de proiect TypeScript, generând cod ES Module.
Răspunsul #8
Doar informații utile - iată cel mai nou runtime TypeScript/JavaScript, Deno.
A fost creat de creatorul Node, Ryan Dahl, bazându-se pe ceea ce ar face diferit dacă ar putea începe de la zero.
Răspunsul #9
Folosește un casetă bună.
Este mai rapid și are o mulțime de unelte incluse.
bun run ./my-script.tsRăspuns #10
Începând cu mai 2022, ts-node acceptă modulele es
npx ts-node --esm file.ts
va trebui probabil să adaugi "type": "module", în package.json. Și unele dintre importuri ar putea fi ciudate decât dacă activezi experimental-specifier-resolution=node
npmjs.com/package/ts-node#commonjs-vs-native-ecmascript-modules
Răspuns #11
Pentru Linux/Mac poți adăuga shebang-ul ts-node-script.
Instalează typescript/ts-node global (vezi 1 mai jos pentru instalare non-globală):
npm install ts-node typescript --save-dev --global
Adaugă aceasta ca prima linie în fișierul tău .ts:
#!/usr/bin/env ts-node-script
Apoi fă ca fișierul să fie executabil:
chmod +x ./your-file.ts
Apoi poți rula fișierul direct din linia de comandă:
./your-file.ts
Note :
1 Pentru instalarea non-globală, poți instala local în proiectul tău
npm install ts-node typescript --save-dev
și adăugați calea relativă la scriptul shebang, de exemplu:
#!/usr/bin/env ./node_modules/.bin/ts-node-script
2 Suportul pentru shebang-uri a fost adăugat oficial în ts-node v8.9.0.
