Node.js unterstützt die Ausführung von TypeScript-Dateien ohne zusätzliche Konfiguration
(nodejs.org)- Node.js wurde so verbessert, dass TypeScript-Dateien direkt ausgeführt werden können
- Ab sofort lassen sich
.ts-Dateien auch ohne zusätzliche Konfiguration oder Transpilierung direkt ausführen - Entwickler können ihre Arbeitseffizienz steigern, ohne tsconfig.json oder einen separaten Bundler installieren zu müssen
- Die Funktion ist ab Node.js v22.18.0 (LTS) offiziell enthalten
- Es wird erwartet, dass sich dadurch die Grenze zwischen JavaScript- und TypeScript-Entwicklung weiter auflöst
Direkte Ausführung von TypeScript in Node.js
- Node.js hat mit der aktuellen Version v22.18.0 (LTS) eine Funktion zur direkten Ausführung von TypeScript-Dateien (.ts) ohne zusätzliche Konfiguration oder Werkzeuge eingeführt
- Bisher waren für die Ausführung von TypeScript-Code externe Transpiler oder Bundler wie ts-node, esbuild oder Babel nötig; nun erkennt und startet Node.js TypeScript-Code direkt selbst, ohne diese Tools
- Mit dieser Funktion können Entwickler
.ts-Dateien in Node.js unmittelbar ausführen, ohne eine tsconfig.json-Konfigurationsdatei oder zusätzliche Bibliotheken - Bei Prototyping, experimenteller Entwicklung und der Ausführung von Skripten steigen Produktivität und Entwicklungsfreundlichkeit deutlich
- Es werden Effekte wie eine stärkere Verknüpfung zwischen JavaScript- und TypeScript-Projekten sowie niedrigere Einstiegshürden für neue Entwickler erwartet
Weitere bemerkenswerte Änderungen
- esm: Implementierung von
import.meta.main - fs: Verbesserte Verarbeitung von fs-Ereignissen auf Basis von AsyncIterator
- permission: Unterstützung für die Weitergabe von Berechtigungsmodell-Flags bei der Ausführung von Unterprozessen
- sqlite: Option
readBigIntshinzugefügt - src/permission: Unterstützung für
permission.has(addon) - url: API
fileURLToPathBufferhinzugefügt - watch: Flag
--watch-kill-signalhinzugefügt - worker: Das
Worker-Objekt wurde zu einem async disposable verbessert
Updates zu Commits und Dokumentation
- Enthält die Entfernung unnötigen Codes, Bereinigungen der Build-Umgebung und Toolchain sowie ein Upgrade auf npm 10.9.3
- In Dokumenten wie
globals.md,child_process.mdundhttp2wurden detaillierte Stabilitätsindikatoren und RFC-Nummern korrigiert - Zahlreiche Tests wurden ergänzt und Bugfixes übernommen
Distributionsdateien
- Installationsdateien und Binärdateien werden für Windows, macOS (Intel/Apple Silicon) und Linux (x64, ARM, PPC, s390x, AIX) bereitgestellt
- Quellcode und vollständige Release-Dateien können auf der offiziellen Distributionsseite von Node.js heruntergeladen werden
- Die API-Dokumentation wurde auf Basis von v22.18.0 aktualisiert
7 Kommentare
Endlich fühlt man sich wirklich erleichtert … Hoffentlich setzt sich das schnell durch.
Für die Ausführung einfacher Skripte scheint es ganz brauchbar zu sein, aber für Live-Projekte gibt es viele Einschränkungen, sodass es wohl kaum zum Einsatz kommen wird.
Wegen der Fehler
ERR_MODULE_NOT_FOUND/ERR_UNSUPPORTED_DIR_IMPORTmuss man auch Erweiterungen und Pfade passend angeben,und Funktionen wie in NestJS, die TypeScript-Build-Unterstützung mit der Einstellung
emitDecoratorMetadatabenötigen, kann man dann nicht nutzen, also ...Ist
--experimental-strip-typesdann standardmäßig aktiviert?Da ich
enumohnehin nicht verwende, läuft es für mich schon allein mit dem reinen Entfernen der Typen völlig ausreichend gut.Das wird ja unglaublich praktisch!
Ich kann mir ein Like einfach nicht verkneifen.
Ich fand schon das Flag
--no-experimental-strip-typesvöllig ausreichend gut.Umso besser scheint es jetzt zu sein.
Hacker-News-Kommentare
node:testin Node.js denke ich inzwischen, dass Node.js in den meisten Fällen eine überzeugende Default-Wahl ist. Die Ausführung mittsxwar bereits ein großer Gewinn für die Lebensqualität, aber noch nicht vollständig. Mit Tools wie zod, ts-rest und trpc werden Runtime-Type-Assertions an den Rändern inzwischen weitgehend gelöst, und Full-Stack-Typescript-Entwicklung ist heute wirklich einfach geworden.ts-Dateien direkt ausführen und bringt einen ordentlich brauchbaren eingebauten Test-Runner mit (--watchwird unterstützt). Auch die eingebauten Pakete werden besser. Beinode:fs/promiseszum Beispiel sind asynchrone Loop-Aufgaben dank Top-Level-Await deutlich einfacher geworden. Es hat lange gedauert, bis alle zu einem realistischen Ansatz bewegt werden konnten, aber jetzt ist die Situation wirklich angenehm.ts-Dateien verbracht. Trpc und ts-rest sind meiner Meinung nach ein ganz anderes Thema. Man kann beides nutzen, aber in Produktion vermeide ich trpc, weil ich dort die API-URL nicht wirklich selbst kontrollieren und alte URLs nicht sauber verwalten und auslaufen lassen kann. Auch bei ts-rest bevorzuge ich meist, API-Request/Response-Paare direkt selbst zu verwalten, indem ich einfach zod und Typen teile. Und jedes Mal stört es mich, wenn ein klar erkennbares RPC-Tool-restim Namen trägttsxausgeführt wird. Selbst wenn die Typen entfernt werden, muss JSX ja noch in JavaScript umgewandelt werden, und genau dieser Teil interessiert mich.mjs-Hack noch braucht. Ich war eine Weile aus dem Ökosystem raus und würde gern wissen, was sich seitdem getan hatnode_modulesnicht akzeptiert wird (siehe: offizielle node.js-Dokumentation). Dann frage ich mich, was mit Projektabhängigkeiten ist. Ich habe eine Bibliothek für Datenmodelle in Typescript geschrieben und möchte sie in meiner App gern im Typescript-Zustand importieren. Ich frage mich, ob diese Regel nur für npm-Pakete gilt oder für alle Abhängigkeiten. Hier steckt eine Chance drin. Ich habe eine auf Golang basierende Runtime für die Ausführung von typescript (genauer: von JS allgemein) gebaut, und auch sobek, das vom Grafana-Team verwendet wird, bräuchte wohl nur Type-Stripping-Unterstützung. Wenn nur eine Runtime käme, die vollständig auf Typescript als Standard setzt, würde das Node.js meiner Meinung nach wirklich revolutionieren. Kein Transpiler, kein typescript-go, kein rust nötig (obwohl rust trotzdem ein bisschen 😉), sondern einfach ein gutes Parsersystem, das Source Maps und Typen im Debug-Modus nachverfolgt. Wie auch immer: Anerkennung und Dank an das Node-Team und alle Mitwirkenden. Weil Node der Standard ist, fühlt es sich an, als würden wir alle ihm folgen. Auch die Embedding-API ist schlicht und sauber nutzbar, was praktisch ist, wenn man Standalone-Binaries bautprivatenode_modulesgibtrecursive-Optionen beiopendir. Das sind nur die Issues, an die ich mich spontan erinnere. Ich warte darauf, dass Bun aufholt, aber für große Projekte scheint es für den produktiven Einsatz noch nicht bereit zu sein. Auch Bun-spezifische Features sehen auf den ersten Blick gut aus, wirken in der Praxis aber unausgereift. Die Dokumentation ist ebenfalls nicht so hochwertig wie die von Node.jslocalAddresswird bei TCP-Verbindungen ignoriertEventEmitter(teilweise gelöst mit eventemitter2)node_moduleslöschen und neu installieren mussteIch habe die TS- und Test-Runner-Funktionen von Node selbst ausprobiert, aber sie sind noch nicht so gut wie bei Bun. Für solche Features nutze ich vorerst weiter Bun. Im Node-Ökosystem habe ich gelernt, dass es besser ist, nicht alles auf ein einziges Tool zu setzen, sondern passende spezialisierte Werkzeuge zu kombinieren.
Bun.js: für die Node-Runtime sowie für TS-Ausführung und Tests. Ich habe Verschiedenes ausprobiert, darunter TSX, TS-Node und Node selbst
NPM: zum Ausführen von Tooling-Skripten
PNPM: für die Installation von Abhängigkeiten. (Meiner Meinung nach das Beste im Vergleich zu npm, yarn und bun)
Biome.js: fürs Linting. Besser als jedes andere Linting-Tool, das ich bisher verwendet habe
import { stripTypeScriptTypes } from 'node:module') ist freigelegt. Wenn man eine einfache Web-App ohne Frontend-Abhängigkeiten entwickelt, kann man alles in Typescript schreiben und beim Ausliefern der Frontend-Skripte einfach nur die Typen entfernen (Beispielprojekt)tsc, und die Typinformationen werden entfernt. Auch Python ignoriert Typannotationen zur Laufzeit, und selbst bei Java werden manche Typinformationen wie Generics im Bytecode gelöschttsclaufen; das funktioniert für mich guttsx, das genauso ohne Build/Transpile läuft. In der Entwicklung ist das sehr nützlich. Danktsx --watchkann ich den Server direkt aus TS-Quellen starten, und bei Änderungen wird er automatisch neu gestartet. Künftig sollte sich mit nodemon und den eingebauten Funktionen von Node eine ähnliche Umgebung bauen lassen. Wenn man Typechecking auch noch zur Laufzeit haben wollte, müsste das auf V8-Ebene unterstützt werden, und das wäre fast ein kompletter Neuaufbauenum: Welche tatsächlich genutzten Fälle gibt es da?