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:

  1. Mai întâi trebuie să instalezi TypeScript

    npm install -g typescript
    
  2. Creează un fișier helloworld.ts

    function hello(person){
       return "Hello, " + person;
    }
    let user = "Aamod Tiwari";
    const result = hello(user);
    console.log("Result", result)
    
  3. Deschide promptul de comandă și tastează următoarea comandă

    tsc helloworld.ts
    
  4. Rulează din nou comanda

    node helloworld.js
    
  5. Rezultatul 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 esrun va 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.ts

Ră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.