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:

  1. Først må du installere TypeScript

    npm install -g typescript
    
  2. Opprett en fil helloworld.ts

    function hello(person){
       return "Hello, " + person;
    }
    let user = "Aamod Tiwari";
    const result = hello(user);
    console.log("Result", result)
    
  3. Åpne kommandoprompt og skriv inn følgende kommando

    tsc helloworld.ts
    
  4. Kjør kommandoen igjen

    node helloworld.js
    
  5. Resultatet 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 esrun vil 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 esrun i 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.ts

Svar #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.

Relaterte artikler