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:
Först behöver du installera TypeScript
npm install -g typescriptSkapa en fil helloworld.ts
function hello(person){ return "Hello, " + person; } let user = "Aamod Tiwari"; const result = hello(user); console.log("Result", result)Öppna kommandotolken och skriv följande kommando
tsc helloworld.tsKör kommandot igen
node helloworld.jsResultatet 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
esrunkommer 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
esruni 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.tsSvar #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.
