Come guardare e ricaricare ts-node quando cambiano i file TypeScript


192

Sto provando a eseguire un server di sviluppo con TypeScript e un'applicazione angolare senza traspilare i file ts ogni volta. Ho scoperto che posso eseguire la corsa con, ts-nodema voglio anche guardare i .tsfile e ricaricare l'app / server come farei con qualcosa come gulp watch.

Risposte:


404

Stavo lottando con la stessa cosa per il mio ambiente di sviluppo fino a quando non ho notato che nodemonl'API ci consente di modificare il suo comportamento predefinito per eseguire un comando personalizzato. Per esempio:

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

O ancora meglio: esternalizza la configurazione di nodemon in un nodemon.jsonfile con il seguente contenuto, quindi esegui nodemon, come suggerito da Sandokan:

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

In virtù di ciò, sarai in grado di ricaricare dal vivo un ts-nodeprocesso senza doversi preoccupare dell'implementazione sottostante.

Saluti!

Aggiornato per la versione più recente di nodemon:

Crea un nodemon.jsonfile con il seguente contenuto.

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

se index.tsè un'istanza esplicita, come posso ucciderla e riavviarla
hjl

@elaijuh in teoria questo stesso comando dovrebbe fare il trucco, quando nodemon è configurato per eseguire un comando personalizzato (in questo caso ts-node) invece del comando del nodo predefinito, chiuderà il processo e ne avvierà uno nuovo ogni volta che trova un cambiamento nell'espressione dell'orologio meno l'espressione ignora :)
HeberLZ,

15
puoi anche creare un file nodemon.json con tutte le opzioni menzionate in questo modo: { "watch": ["src/**/*.ts"], "ignore": ["src/**/*.spec.ts"], "exec": "ts-node ./app-server.ts" }e basta digitarenodemon
Sandokan El Cojo

3
Ho fatto l'errore di aggiungere ./prima dei nomi delle cartelle e si è rotto. Questo ha funzionato per me: { "verbose": true, "watch": ["server/**/*.ts"], "ext": "ts js json", "ignore": ["server/**/*.spec.ts"], "exec": "ts-node index.ts" }. E riga di comando:nodemon --watch server/**/*.ts --ignore server/**/*.spec.ts --verbose --exec ts-node index.ts
Adrian Moisa,

2
Vorrei solo menzionare che devi anche impostare il extfile nel file di configurazione, quindi la sua ricerca di ts cambia. Il mio file di configurazione è simile al seguente:{ "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

114

Ho scaricato nodemone ts-nodein favore di un'alternativa molto migliore, ts-node-dev https://github.com/whitecolor/ts-node-dev

Corri ts-node-dev src/index.ts


6
E perché è meglio?
Deilan,

22
È più veloce e rileva automaticamente quali file devono essere guardati, non è necessaria alcuna configurazione.
Mikael Couzic,

4
Questa è l'opzione migliore (se non l'unica) per ts-node, specialmente per progetti più grandi. Non ricompila tutti i file da zero, ma esegue una compilazione incrementale, come tsc --watch.
Angelos Pikoulas,

3
nel mio caso, questo letteralmente 10 volte più veloce rispetto nodemona ts-node. Grazie!
Florian,

3
Quindi ho letteralmente "start": "ts-node-dev src". Non c'è bisogno di babele, nodemon o nessuna delle configurazioni che ne derivano. Tutto è gestito per te.
JMadelaine,

53

Ecco un'alternativa alla risposta di HeberLZ , usando gli script npm.

Il mio package.json:

  "scripts": {
    "watch": "nodemon -e ts -w ./src -x npm run watch:serve",
    "watch:serve": "ts-node --inspect src/index.ts"
  },
  • -e flag imposta le estensioni da cercare,
  • -w imposta la directory controllata,
  • -x esegue lo script.

--inspectnello watch:servescript è in realtà un flag node.js, abilita solo il protocollo di debug.


2
Assicurati anche di avere dattiloscritto installato localmente per il progetto. Altrimenti l'errore che potresti ricevere non è molto chiaro.
Aranir,

Penso che dovrebbe essere ts-node --inspect -- src/index.tsora dovuto a questo .
bluenote10

1
Questo approccio sembra generare un notevole risultato superfluo.
Freewalker,

-e ts -w ./srcha fatto il trucco per me - ha funzionato con un progetto generato dalla CLI di loopback4
Jonathan Cardoz il

16

In particolare per questo problema ho creato la tsc-watchlibreria. lo puoi trovare su npm .

Caso d'uso ovvio sarebbe:

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


Come funzionerebbe nel caso di un server express o koa poiché in realtà non uccide l'istanza del nodo precedente?
Brianestey,

'tsc-watch' uccide e riavvia il processo per te.
Gilamran,

Questo e 'esattamente quello che stavo cercando. Non sono sicuro di quale sia lo scopo di ts-node-dev, ma non sono riuscito a riportare errori di dattiloscritto. Dopo aver passato ore a cercare di farlo funzionare, ho provato tsc-watch, e ha funzionato come un incantesimo!
Charles Naccio,

@gilamran nella documentazione del tuo pacchetto c'è un refuso: "[...] similar to nodemon but for TypeCcript.":)
Massimiliano Kraus

13

Questo funziona per me:

nodemon src/index.ts

Apparentemente grazie a questa richiesta pull: https://github.com/remy/nodemon/pull/1552


Questo funziona anche per me, ma come? Sembra un po 'magico. Cosa sta compilando il dattiloscritto? Non ho ts-nodeinstallato.
d512,

1
@ d512 Sei sicuro che non sia nel tuo node_modules/? Per me fallisce se non ce l'ho.
DLight

1
Questo in effetti richiede ts-nodel'installazione. L'esecuzione di questo comando senza ts-nodecomporterà un failed to start process, "ts-node" exec not founderrore. Probabilmente hai avuto questo come artefatto rimanente node_modules. Detto questo, questa soluzione è molto più bella poiché non richiede ulteriore configurazione.
Brandon Clapp,

12

Aggiungi "watch": "nodemon --exec ts-node -- ./src/index.ts"alla scriptssezione del tuo package.json.


7

potresti usare ts-node-dev

Riavvia il processo del nodo di destinazione quando uno qualsiasi dei file richiesti cambia (come standard node-dev) ma condivide il processo di compilazione di Typescript tra i riavvii.

Installare

yarn add ts-node-dev --dev

e il tuo package.json potrebbe essere così

"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"
}

Grazie! Questo è stato il modo più semplice che ho trovato per abilitare la ricarica automatica con il mio server nodo.
Hisham Mubarak,

7

ho fatto con

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

e inizia il filato .. ts-node non come 'ts-node'


1

Preferirei non usare ts-node ed eseguire sempre dalla cartella dist.

Per fare ciò, basta impostare package.json con la configurazione predefinita:

....
"main": "dist/server.js",
  "scripts": {
    "build": "tsc",
    "prestart": "npm run build",
    "start": "node .",
    "dev": "nodemon"
  },
....

e quindi aggiungere il file di configurazione nodemon.json :

{
  "watch": ["src"],
  "ext": "ts",
  "ignore": ["src/**/*.spec.ts"],
  "exec": "npm restart"
}

Qui, utilizzo "exec": "npm restart" in
modo che tutto il file ts si ricompilerà nel file js e quindi riavvierò il server.

Per eseguire mentre si è in ambiente di sviluppo,

npm run dev

Usando questa configurazione, eseguirò sempre i file distribuiti e non sarà necessario ts-node.


0

aggiungilo al tuo file package.json

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

e per far funzionare tutto ciò è necessario installare anche ts-node come dipendenza dev

yarn add ts-node -D

eseguire yarn devper avviare il server di sviluppo

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.