node.js - Hvordan kjøre TypeScript-filer fra kommandolinjen?
Jeg har overraskende vanskelig for å finne et svar på dette. Med vanlig Node.JS kan du kjøre hvilken som helst js-fil med node path/to/file.js, med CoffeeScript er det coffee hello.coffee og ES6 har babel-node hello.js. Hvordan gjør jeg det samme med Typescript?
Prosjektet mitt har en tsconfig.json som brukes av Webpack/ts-loader for å bygge en fin liten pakke for nettleseren. Jeg har derimot behov for et byggesteg kjørt fra konsollen før det, som ville bruke noen av .ts-filene som brukes i prosjektet for å generere et skjema, men jeg ser ut til å ikke kunne kjøre en enkelt Typescript-fil uten å kompilere hele prosjektet.
Svar #1
Du kan la tsc kjøre i overvåkingsmodus ved å bruke tsc -w -p ., og det vil generere .js-filer for deg på en levende måte, slik at du kan kjøre node foo.js som vanlig.
For å kjøre en enkelt TypeScript-fil uten å kompilere hele prosjektet, finnes det ts-node som vil kompilere koden på farten og kjøre den gjennom Node:
npx ts-node src/foo.ts
Svar #2
Kjør kommandoene nedenfor og installer de nødvendige pakkene globalt:
npm install -g ts-node typescript '@types/node'
Kjør nå følgende kommando for å kjøre en TypeScript-fil:
ts-node typescript-file.ts
Svar #3
Du kan også prøve tsx. tsx er en CLI-kommando (et alternativ til node) for å kjøre TypeScript sømløst, den er bygget på esbuild, så den er veldig rask.
https://github.com/esbuild-kit/tsx
Eksempel :
npx tsx ./script.ts
Svar #4
Vi har følgende trinn:
Først må du installere TypeScript
npm install -g typescriptOpprett en fil helloworld.ts
function hello(person){ return "Hello, " + person; } let user = "Aamod Tiwari"; const result = hello(user); console.log("Result", result)Åpne kommandoprompt og skriv inn følgende kommando
tsc helloworld.tsKjør kommandoen igjen
node helloworld.jsResultatet vil vises på konsollen
Svar #5
For å legge til i @Aamod-svaret ovenfor, hvis du vil bruke en kommandolinje for å kompilere og kjøre koden din, kan du bruke følgende:
Windows :
tsc main.ts | node main.js
Linux/macOS:
tsc main.ts && node main.js
Svar #6
Jeg laget @digitak/esrun, en tynn wrapper rundt esbuild som kjører en TypeScript-fil nesten umiddelbart. esrun ble laget fordi jeg var skuffet over ts-node: for tregt, og fungerte bare sjelden.
Fordeler med esrun over ts-node inkluderer:
- veldig raskt (bruker esbuild),
- kan importere ESM så vel som CJS (bare bruk bibliotekene du foretrekker, og
esrunvil fungere uten ytterligere konfigurasjon), - det er en inkludert overvåkingsmodus, kjør skriptet ditt med
--watch-alternativet, og enhver endring i inngangsfilen din eller noen av dens avhengigheter vil utløse resultatet på nytt - du kan bruke
esruni inspeksjonsmodus for å bruke DevTools-konsollen i stedet for terminalkonsollen din.
Etter installasjon, bare kjør:
npx @digitak/esrun file.ts
Svar #7
Rediger: mai 2022
ts-node har nå et --esm-flagg, bruk det.
Gammelt svar:
Ingen av de andre svarene diskuterer hvordan man kjører et TypeScript-skript som bruker moduler, og spesielt moderne ES-moduler.
Først og fremst fungerer ikke ts-node i det scenariet, fra og med mars 2020. Så vi nøyer oss med tsc etterfulgt av node.
For det andre kan ikke TypeScript fortsatt generere .mjs-filer. Så vi nøyer oss med .js-filer og "type": "module" i package.json.
For det tredje vil du ha rene import-linjer, uten å spesifisere .js-utvidelsen (som ville være forvirrende i .ts-filer):
import { Lib } from './Lib';
Vel, det er ikke trivielt. Node krever at man spesifiserer filutvidelser på imports, med mindre man bruker experimental-specifier-resolution=node-flagget. I dette tilfellet ville det gjøre det mulig for Node å søke etter Lib.js eller Lib/index.js når du kun spesifiserer ./Lib på import-linjen.
For det fjerde, det er fortsatt en hake: hvis du har et annet main-filnavn enn index.js i pakken din, vil ikke Node finne det.
Transpiling gjør ting mye mer rotete enn å kjøre vanlig Node.
Her er et eksempelrepo med en moderne TypeScript-prosjektstruktur, som genererer ES-modulkode.
Svar #8
Bare nyttig informasjon - her er den nyeste TypeScript/JavaScript-runtime Deno.
Den ble laget av skaperen av Node, Ryan Dahl, basert på hva han ville gjort annerledes hvis han kunne starte på nytt.
Svar #9
Bruk bolle.
Det er raskere og har mye verktøy inkludert.
bun run ./my-script.tsSvar #10
Per mai 2022 støtter ts-node es-moduler
npx ts-node --esm file.ts
du vil sannsynligvis trenge å legge til "type": "module", i din package.json. Og noen av importene kan være rare med mindre du aktiverer experimental-specifier-resolution=node
npmjs.com/package/ts-node#commonjs-vs-native-ecmascript-modules
Svar #11
For Linux/Mac kan du legge til ts-node-script shebang.
Installer typescript/ts-node globalt (se 1 nedenfor for ikke-global installasjon):
npm install ts-node typescript --save-dev --global
Legg dette til som den første linjen i .ts-filen din:
#!/usr/bin/env ts-node-script
Gjør deretter filen kjørbar:
chmod +x ./your-file.ts
Du kan deretter kjøre filen direkte fra kommandolinjen:
./your-file.ts
Notater :
1 For ikke global installasjon kan du installere lokalt til prosjektet ditt
npm install ts-node typescript --save-dev
og legg til den relative stien til shebang-skriptet, f.eks:
#!/usr/bin/env ./node_modules/.bin/ts-node-script
2 Støtte for shebangs ble offisielt lagt til i ts-node v8.9.0.
