So überwachen und laden Sie ts-node neu, wenn sich TypeScript-Dateien ändern

188

Ich versuche, einen Entwicklungsserver mit TypeScript und einer Angular-Anwendung auszuführen, ohne jedes Mal ts-Dateien zu transpilieren. Ich habe festgestellt, dass ich das Laufen mit machen kann, ts-nodeaber ich möchte auch .tsDateien ansehen und die App / den Server neu laden, wie ich es mit so etwas wie gulp watch tun würde.

Ieltxu Algañarás
quelle

Antworten:

398

Ich hatte mit dem gleichen Problem für meine Entwicklungsumgebung zu kämpfen, bis ich bemerkte, dass nodemondie API es uns ermöglicht, das Standardverhalten zu ändern, um einen benutzerdefinierten Befehl auszuführen. Beispielsweise:

nodemon --watch 'src/**/*.ts' --ignore 'src/**/*.spec.ts' --exec 'ts-node' src/index.ts

Oder noch besser: Externalisieren Sie die Konfiguration von nodemon in eine nodemon.jsonDatei mit dem folgenden Inhalt und führen Sie sie einfach aus nodemon, wie Sandokan vorgeschlagen hat:

{ "watch": ["src/**/*.ts"], "ignore": ["src/**/*.spec.ts"], "exec": "ts-node ./index.ts" }

Auf diese Weise können Sie einen ts-nodeProzess live neu laden , ohne sich um die zugrunde liegende Implementierung kümmern zu müssen.

Prost!

Aktualisiert für die neueste Version von nodemon:

Erstellen Sie eine nodemon.jsonDatei mit dem folgenden Inhalt.

{
  "watch": ["src"],
  "ext": "ts",
  "ignore": ["src/**/*.spec.ts"],
  "exec": "ts-node ./src/index.ts"      // or "npx ts-node src/index.ts"
}
HeberLZ
quelle
Wenn index.tses sich um eine Express-Instanz handelt, wie kann ich sie
beenden
@elaijuh Theoretisch sollte derselbe Befehl den Trick ausführen. Wenn nodemon so konfiguriert ist, dass anstelle des Standardknotenbefehls ein benutzerdefinierter Befehl (in diesem Fall ts-node) ausgeführt wird, wird der Prozess heruntergefahren und jedes Mal ein neuer gestartet findet eine Änderung am
Uhrausdruck
15
Sie können auch eine nodemon.json-Datei mit allen genannten Optionen wie folgt erstellen: { "watch": ["src/**/*.ts"], "ignore": ["src/**/*.spec.ts"], "exec": "ts-node ./app-server.ts" }und einfach eingebennodemon
Sandokan El Cojo
3
Ich habe den Fehler gemacht, ./vor den Ordnernamen hinzuzufügen, und es ist kaputt gegangen. Das hat bei mir funktioniert : { "verbose": true, "watch": ["server/**/*.ts"], "ext": "ts js json", "ignore": ["server/**/*.spec.ts"], "exec": "ts-node index.ts" }. Und Kommandozeile:nodemon --watch server/**/*.ts --ignore server/**/*.spec.ts --verbose --exec ts-node index.ts
Adrian Moisa
2
Ich möchte nur erwähnen, dass Sie das auch extin der Konfigurationsdatei einstellen müssen , damit sich die Suche nach ts ändert. Meine Konfigurationsdatei sieht folgendermaßen aus:{ "watch": ["src/**/*.ts"], "ignore": ["src/**/*.spec.ts"], "ext": "ts js json", "_exec": "node dist/startup.js", "exec": "ts-node src/startup.ts" }
Lasse D. Slot
111

Ich habe abgeladen nodemonund ts-nodefür eine viel bessere Alternative, ts-node-dev https://github.com/whitecolor/ts-node-dev

Renn einfach ts-node-dev src/index.ts

Mikael Couzic
quelle
6
Und warum ist das besser?
Deilan
21
Es ist schneller und erkennt automatisch, welche Dateien überwacht werden müssen, ohne dass eine Konfiguration erforderlich ist.
Mikael Couzic
4
Dies ist die beste (wenn nicht die einzige) Option für ts-node, insbesondere für größere Projekte. Es werden nicht alle Dateien von Grund auf neu kompiliert, sondern es wird eine inkrementelle Kompilierung durchgeführt, wie z tsc --watch.
Angelos Pikoulas
2
in meinem Fall ist dies buchstäblich 10 mal schneller als nodemonmit ts-node. Danke dir!
Florian
3
Also habe ich buchstäblich nur "start": "ts-node-dev src". Keine Notwendigkeit für Babel, Nodemon oder eine der mitgelieferten Konfigurationen. Alles wird für Sie erledigt.
JMadelaine
50

Hier ist eine Alternative zur Antwort des HeberLZ mit npm-Skripten.

Mein package.json:

  "scripts": {
    "watch": "nodemon -e ts -w ./src -x npm run watch:serve",
    "watch:serve": "ts-node --inspect src/index.ts"
  },
  • -e flag setzt die zu suchenden Erweiterungen,
  • -w legt das überwachte Verzeichnis fest,
  • -x führt das Skript aus.

--inspectim watch:serveSkript ist eigentlich ein node.js-Flag, es aktiviert nur das Debugging-Protokoll.

im.pankratov
quelle
2
Stellen Sie außerdem sicher, dass Typoskript lokal für das Projekt installiert ist. Andernfalls ist der Fehler, den Sie möglicherweise erhalten, nicht sehr klar.
Aranir
Ich denke, das sollte ts-node --inspect -- src/index.tsjetzt daran liegen .
bluenote10
1
Dieser Ansatz scheint eine beträchtliche überflüssige Ausgabe zu erzeugen.
Freewalker
-e ts -w ./srchat den Trick für mich gemacht - dies funktionierte mit einem von Loopback4 CLI generierten Projekt
Jonathan Cardoz
15

Speziell für dieses Problem habe ich die tsc-watchBibliothek erstellt. Sie können es auf npm finden .

Offensichtlicher Anwendungsfall wäre:

tsc-watch server.ts --outDir ./dist --onSuccess "node ./dist/server.js"

Gilamran
quelle
Wie würde dies bei einem Express- oder Koa-Server funktionieren, da die vorherige Knoteninstanz nicht tatsächlich beendet wird?
Brianestey
'tsc-watch' beendet den Prozess und startet ihn für Sie neu.
Gilamran
Genau das habe ich gesucht. Ich bin mir nicht sicher, was der Zweck von ts-node-dev ist, aber ich konnte es nicht dazu bringen, Typoskriptfehler zu melden. Nachdem ich stundenlang versucht hatte, es zum Laufen zu bringen, versuchte ich es mit tsc-watch und es funktionierte wie ein Zauber!
Charles Naccio
@ Gilamran In der Dokumentation Ihres Pakets gibt es einen Tippfehler: "[...] similar to nodemon but for TypeCcript.":)
Massimiliano Kraus
11

In "watch": "nodemon --exec ts-node -- ./src/index.ts"zu scriptsAbschnitt Ihrer package.json.

Takao Shibamoto
quelle
11

Das funktioniert bei mir:

nodemon src/index.ts

Anscheinend danke seit dieser Pull-Anfrage: https://github.com/remy/nodemon/pull/1552

DLight
quelle
Das funktioniert auch bei mir, aber wie? Scheint irgendwie magisch. Was kompiliert das Typoskript? Ich habe nicht ts-nodeinstalliert.
d512
1
@ d512 Bist du sicher, dass es nicht in deinem ist node_modules/? Für mich scheitert es, wenn ich es nicht habe.
DLight
1
Dies muss in der Tat ts-nodeinstalliert werden. Das Ausführen dieses Befehls ohne ts-nodeführt zu einem failed to start process, "ts-node" exec not foundFehler. Sie hatten dies wahrscheinlich als übrig gebliebenes Artefakt in node_modules. Abgesehen davon ist diese Lösung viel besser, da keine zusätzliche Konfiguration erforderlich ist.
Brandon Clapp
6

Sie könnten ts-node-dev verwenden

Der Zielknotenprozess wird neu gestartet, wenn sich eine der erforderlichen Dateien ändert (als Standardknotenentwickler), der Typescript-Kompilierungsprozess wird jedoch zwischen den Neustarts gemeinsam genutzt.

Installieren

yarn add ts-node-dev --dev

und Ihre package.json könnte so sein

"scripts": {
  "test": "echo \"Error: no test specified\" && exit 1",
  "tsc": "tsc",
  "dev": "ts-node-dev --respawn --transpileOnly ./src/index.ts",
  "prod": "tsc && node ./build/index.js"
}
jsina
quelle
Danke dir! Dies war der einfachste Weg, das automatische Neuladen mit meinem Knotenserver zu aktivieren.
Hisham Mubarak
6

Ich habe mit

"start": "nodemon --watch 'src/**/*.ts' --ignore 'src/**/*.spec.ts' --exec ts-node src/index.ts"

und Garnstart .. ts-Knoten nicht wie 'ts-Knoten'

Wayan Wahyu Adi Putra
quelle
0

Fügen Sie dies Ihrer Datei package.json hinzu

scripts {
"dev": "nodemon --watch '**/*.ts' --exec 'ts-node' index.ts"
}

Damit dies funktioniert, müssen Sie auch ts-node als dev-Abhängigkeit installieren

yarn add ts-node -D

Führen Sie aus yarn dev, um den Entwicklungsserver zu starten

princebillyGK
quelle