Comment surveiller et recharger ts-node lorsque les fichiers TypeScript changent

214

J'essaie d'exécuter un serveur de développement avec TypeScript et une application angulaire sans transpiler les fichiers ts à chaque fois. J'ai trouvé que je peux faire la course avec ts-nodemais je veux aussi regarder les .tsfichiers et recharger l'application / le serveur comme je le ferais avec quelque chose comme gulp watch.

Ieltxu Algañarás
la source

Réponses:

448

EDIT: mis à jour pour la dernière version de nodemon!

J'avais du mal avec la même chose pour mon environnement de développement jusqu'à ce que je remarque que nodemonl'API de nous permet de changer son comportement par défaut afin d'exécuter une commande personnalisée. Par exemple:

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

Ou encore mieux: extériorisez la configuration de nodemon dans un nodemon.jsonfichier avec le contenu suivant, puis exécutez simplement nodemon, comme Sandokan l'a suggéré:

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

En faisant cela, vous serez en mesure de recharger en direct un ts-nodeprocessus sans avoir à vous soucier de l'implémentation sous-jacente.

À votre santé!

Mise à jour pour la version la plus récente de nodemon:

Vous pouvez exécuter ceci, par exemple:

nodemon --watch "src/**" --ext "ts,json" --ignore "src/**/*.spec.ts" --exec "ts-node src/index.ts"

Ou créez un nodemon.jsonfichier avec le contenu suivant:

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

puis exécutez nodemonsans arguments.

HeberLZ
la source
si index.tsest une instance express, comment puis-je la tuer et la redémarrer
hjl
@elaijuh en théorie, cette même commande devrait faire l'affaire, lorsque nodemon est configuré pour exécuter une commande personnalisée (dans ce cas ts-node) au lieu de la commande de nœud par défaut, il arrête le processus et en démarre un nouveau à chaque fois trouve un changement sur l'expression de la montre moins l'expression ignorer :)
HeberLZ
16
vous pouvez également créer un fichier nodemon.json avec toutes les options mentionnées comme ceci: { "watch": ["src/**/*.ts"], "ignore": ["src/**/*.spec.ts"], "exec": "ts-node ./app-server.ts" }et tapez simplementnodemon
Sandokan El Cojo
3
J'ai fait l'erreur d'ajouter ./avant les noms de dossier et ça s'est cassé. Cela a fonctionné pour moi: { "verbose": true, "watch": ["server/**/*.ts"], "ext": "ts js json", "ignore": ["server/**/*.spec.ts"], "exec": "ts-node index.ts" }. Et ligne de commande:nodemon --watch server/**/*.ts --ignore server/**/*.spec.ts --verbose --exec ts-node index.ts
Adrian Moisa
2
Je voudrais juste mentionner que vous devez également définir le extdans le fichier de configuration, de sorte que son look pour ts change. Mon fichier de configuration ressemble à ceci:{ "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
132

J'ai abandonné nodemonet ts-nodeen faveur d'une bien meilleure alternative, ts-node-dev https://github.com/whitecolor/ts-node-dev

Courez ts-node-dev src/index.ts

Mikael Couzic
la source
6
Et pourquoi est-ce mieux?
Deilan
24
C'est plus rapide et détecte automatiquement quels fichiers doivent être surveillés, aucune configuration n'est nécessaire.
Mikael Couzic
4
C'est la meilleure option (sinon la seule) pour ts-node, en particulier pour les projets plus importants. Il ne recompile pas tous les fichiers à partir de zéro, mais effectue une compilation incrémentielle, comme tsc --watch.
Angelos Pikoulas
3
dans mon cas, c'est littéralement 10 fois plus rapide nodemonqu'avec ts-node. Merci!
Flo le
3
Alors j'ai littéralement juste "start": "ts-node-dev src". Pas besoin de babel, nodemon ou l'une des configurations qui l'accompagne. Tout est géré pour vous.
JMadelaine
56

Voici une alternative à l'HeberLZ réponse , en utilisant des scripts MNP.

Mon package.json:

  "scripts": {
    "watch": "nodemon -e ts -w ./src -x npm run watch:serve",
    "watch:serve": "ts-node --inspect src/index.ts"
  },
  • -e flag définit les extensions à rechercher,
  • -w définit le répertoire surveillé,
  • -x exécute le script.

--inspectdans le watch:servescript est en fait un indicateur node.js, il active simplement le protocole de débogage.

im.pankratov
la source
2
Assurez-vous également que dactylographié est installé localement pour le projet. Sinon, l'erreur que vous pourriez obtenir n'est pas très claire.
Aranir
Je pense que cela devrait être ts-node --inspect -- src/index.tsmaintenant à cause de cela .
bluenote10
1
Cette approche semble générer une production superflue considérable.
Freewalker
-e ts -w ./srca fait l'affaire pour moi - cela a fonctionné avec un projet généré par CLI loopback4
Jonathan Cardoz
19

Cela fonctionne pour moi:

nodemon src/index.ts

Apparemment grâce à depuis cette pull request: https://github.com/remy/nodemon/pull/1552

DLight
la source
Cela fonctionne pour moi aussi mais comment? Cela semble un peu magique. Qu'est-ce qui compile le dactylographié? Je n'ai pas ts-nodeinstallé.
d512
1
@ d512 Êtes-vous sûr que ce n'est pas dans votre node_modules/? Pour moi, cela échoue si je ne l'ai pas.
DLight du
1
Cela nécessite ts-nodeen effet d'être installé. L'exécution de cette commande sans ts-nodeentraînera une failed to start process, "ts-node" exec not founderreur. Vous aviez probablement cela comme un artefact résiduel node_modules. Cela étant dit, cette solution est beaucoup plus agréable car elle ne nécessite pas de configuration supplémentaire.
Brandon Clapp
Installez ts-node globalement:npm install -g ts-node
Rafael Pizao le
18

Spécifiquement pour ce problème, j'ai créé la tsc-watchbibliothèque. vous pouvez le trouver sur npm .

Le cas d'utilisation évident serait:

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

gilamran
la source
Comment cela fonctionnerait-il dans le cas d'un serveur express ou koa puisqu'il ne tue pas réellement l'instance de nœud précédente?
brianestey
«tsc-watch» tue et redémarre le processus pour vous.
gilamran
Ceci est exactement ce que je cherchais. Je ne sais pas quel est le but de ts-node-dev, mais je n'ai pas pu le faire signaler les erreurs de typographie. Après avoir passé des heures à essayer de le faire fonctionner, j'ai essayé tsc-watch, et cela a fonctionné comme un charme!
Charles Naccio le
@gilamran dans la documentation de votre paquet il y a une faute de frappe: "[...] similar to nodemon but for TypeCcript.":)
Massimiliano Kraus
13

Ajouter "watch": "nodemon --exec ts-node -- ./src/index.ts"à la scriptssection de votre package.json.

takasoft
la source
10

vous pouvez utiliser ts-node-dev

Il redémarre le processus du nœud cible lorsque l'un des fichiers requis change (comme standard node-dev) mais partage le processus de compilation Typescript entre les redémarrages.

Installer

yarn add ts-node-dev --dev

et votre package.json pourrait être comme ça

"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
la source
Merci! C'était le moyen le plus simple que j'ai trouvé pour activer le rechargement automatique avec mon serveur de nœuds.
Hisham Mubarak le
8

j'ai fait avec

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

et yarn start .. ts-node pas comme 'ts-node'

wayan wahyu Adi Putra
la source
3

Je préférerais ne pas utiliser ts-node et toujours courir à partir du dossier dist.

Pour ce faire, configurez simplement votre package.json avec la configuration par défaut:

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

puis ajoutez le fichier de configuration nodemon.json :

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

Ici, j'utilise "exec": "npm restart"
pour que tous les fichiers ts soient recompilés en fichier js, puis redémarrent le serveur.

Pour s'exécuter dans un environnement de développement,

npm run dev

En utilisant cette configuration, je vais toujours courir à partir des fichiers distribués et je n'ai pas besoin de ts-node.

Raja PB
la source
2

ajoutez ceci à votre fichier package.json

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

et pour que cela fonctionne, vous devez également installer ts-node en tant que dev-dependency

yarn add ts-node -D

exécuter yarn devpour démarrer le serveur de développement

princebillyGK
la source
0

Une autre façon pourrait être de compiler le code d'abord en mode montre avec tsc -w, puis d'utiliser nodemon sur javascript. Cette méthode est similaire en vitesse à ts-node-dev et présente l'avantage d'être plus proche de la production.

 "scripts": {
    "watch": "tsc -w",
    "dev": "nodemon dist/index.js"
  },
Miguel Ángel Torres
la source