node.js - Hur man kör TypeScript-filer från kommandoraden?


Jag har ovanligt svårt att hitta ett svar på detta. Med vanlig Node.JS kan du köra vilken js-fil som helst med node path/to/file.js, med CoffeeScript är det coffee hello.coffee och ES6 har babel-node hello.js. Hur gör jag samma sak med Typescript?

Mitt projekt har en tsconfig.json som används av Webpack/ts-loader för att bygga ett trevligt litet paket för webbläsaren. Jag har dock behov av ett byggsteg som körs från konsolen innan det, som skulle använda några av .ts-filerna som används i projektet för att generera ett schema, men jag verkar inte kunna köra en enskild Typescript-fil utan att kompilera hela projektet.

Svar #1

Du kan låta tsc köras i bevakningsläge med tsc -w -p . och det kommer att generera .js-filer åt dig på ett direkt sätt, så att du kan köra node foo.js som vanligt.

För att köra en enskild TypeScript-fil utan att kompilera hela projektet finns ts-node som kommer att kompilera koden direkt och köra den genom Node:

npx ts-node src/foo.ts

Svar #2

Kör de nedanstående kommandona och installera de nödvändiga paketen globalt:

npm install -g ts-node typescript '@types/node'

Kör nu följande kommando för att köra en TypeScript-fil:

ts-node typescript-file.ts

Svar #3

Du kan också prova tsx. tsx är ett CLI-kommando (ett alternativ till node) för att köra TypeScript sömlöst, det är byggt på esbuild så det är väldigt snabbt.

https://github.com/esbuild-kit/tsx

Exempel :

npx tsx ./script.ts

Svar #4

Vi har följande steg:

  1. Först behöver du installera TypeScript

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

    function hello(person){
       return "Hello, " + person;
    }
    let user = "Aamod Tiwari";
    const result = hello(user);
    console.log("Result", result)
    
  3. Öppna kommandotolken och skriv följande kommando

    tsc helloworld.ts
    
  4. Kör kommandot igen

    node helloworld.js
    
  5. Resultatet kommer att visas på konsolen

Svar #5

För att lägga till på @Aamods svar ovan, om du vill använda ett kommandorad för att kompilera och köra din kod, kan du använda följande:

Windows :

tsc main.ts | node main.js

Linux/macOS:

tsc main.ts && node main.js

Svar #6

Jag skapade @digitak/esrun, ett tunt omslag runt esbuild som kör en TypeScript-fil nästan omedelbart. esrun skapades eftersom jag var besviken på ts-node: för långsamt och fungerade oftast inte.

Fördelar med esrun jämfört med ts-node inkluderar:

  • mycket snabb (använder esbuild),
  • kan importera ESM såväl som CJS (använd bara de bibliotek du väljer och esrun kommer att fungera direkt),
  • det finns ett inkluderat klockläge, kör ditt skript med --watch-alternativet och varje ändring av din ingångsfil eller någon av dess beroenden kommer att trigga resultatet igen
  • du kan använda esrun i inspektionsläge för att använda DevTools-konsolen istället för din terminalkonsol.

Efter installationen, kör bara:

npx @digitak/esrun file.ts

Svar #7

Redigera: maj 2022

ts-node har nu ett --esm-flagga, använd det.

Gammalt svar:

Inget av de andra svaren diskuterar hur man kör ett TypeScript-skript som använder moduler, och särskilt moderna ES-moduler.

För det första fungerar inte ts-node i det scenariot, från och med mars 2020. Så vi nöjer oss med tsc följt av node.

För det andra kan TypeScript fortfarande inte generera .mjs-filer. Så vi nöjer oss med .js-filer och "type": "module" i package.json.

För det tredje vill du ha rena import-rader, utan att specificera .js-tillägget (vilket skulle vara förvirrande i .ts-filer):

import { Lib } from './Lib';

Tja, det är inte trivialt. Node kräver att man specificerar filändelser på imports, om man inte använder flaggan experimental-specifier-resolution=node. I det här fallet skulle det göra det möjligt för Node att leta efter Lib.js eller Lib/index.js när du bara specificerar ./Lib på import-raden.

För det fjärde, det finns fortfarande ett problem: om du har ett annat main-filnamn än index.js i ditt paket, kommer Node inte att hitta det.

Transpiling gör saker mycket mer röriga än att köra vanlig Node.

Här är ett exempelrepo med en modern TypeScript-projektstruktur som genererar ES-modulkod.

Svar #8

Bara användbar information - här är den senaste TypeScript/JavaScript-runtime Deno.

Den skapades av skaparen av Node, Ryan Dahl, baserat på vad han skulle göra annorlunda om han kunde börja om från början.

Svar #9

Använd bulle.

Det är snabbare och har många verktyg samlade i paketet.

bun run ./my-script.ts

Svar #10

Från och med maj 2022 stöder ts-node es-moduler

npx ts-node --esm file.ts

du kommer troligen behöva lägga till "type": "module", i din package.json. Och några av importerna kan vara krångliga om du inte aktiverar experimental-specifier-resolution=node

npmjs.com/package/ts-node#commonjs-vs-native-ecmascript-moduler

Svar #11

För Linux/Mac kan du lägga till ts-node-script shebang.

Installera typescript/ts-node globalt (se 1 nedan för installation utan globalt):

npm install ts-node typescript --save-dev --global

Lägg till detta som den första raden i din .ts-fil:

#!/usr/bin/env ts-node-script

Gör sedan filen körbar:

chmod +x ./your-file.ts

Du kan sedan köra filen direkt från kommandoraden:

./your-file.ts

Anteckningar :

1 För icke-global installation kan du installera lokalt i ditt projekt

npm install ts-node typescript --save-dev

och lägg till den relativa sökvägen till shebang-skriptet t.ex:

#!/usr/bin/env ./node_modules/.bin/ts-node-script

2 Stöd för shebangs lades officiellt till i ts-node v8.9.0.

Relaterade artiklar