Cómo mirar y recargar ts-node cuando cambian los archivos TypeScript

192

Estoy tratando de ejecutar un servidor de desarrollo con TypeScript y una aplicación Angular sin transpilar archivos ts cada vez. Descubrí que puedo ejecutarlo, ts-nodepero también quiero ver .tsarchivos y volver a cargar la aplicación / servidor como lo haría con algo como gulp watch.

Ieltxu Algañarás
fuente

Respuestas:

404

Estaba luchando con lo mismo para mi entorno de desarrollo hasta que noté que nodemonla API nos permite cambiar su comportamiento predeterminado para ejecutar un comando personalizado. Por ejemplo:

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

O incluso mejor: externalice la configuración de nodemon a un nodemon.jsonarchivo con el siguiente contenido, y luego simplemente ejecute nodemon, como sugirió Sandokan:

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

En virtud de esto, podrá recargar en vivo un ts-nodeproceso sin tener que preocuparse por la implementación subyacente.

¡Salud!

Actualizado para la versión más reciente de nodemon:

Cree un nodemon.jsonarchivo con el siguiente contenido.

{
  "watch": ["src"],
  "ext": "ts",
  "ignore": ["src/**/*.spec.ts"],
  "exec": "ts-node ./src/index.ts"      // or "npx ts-node src/index.ts"
}
HeberLZ
fuente
si index.tses una instancia expresa, ¿cómo puedo matarlo y reiniciar?
hjl
@elaijuh en teoría, este mismo comando debería hacer el truco, cuando nodemon está configurado para ejecutar un comando personalizado (en este caso ts-node) en lugar del comando de nodo predeterminado, cerrará el proceso e iniciará uno nuevo cada vez que encuentra un cambio en la expresión del reloj menos la expresión ignorar :)
HeberLZ
15
también puede crear un archivo nodemon.json con todas las opciones mencionadas de esta manera: { "watch": ["src/**/*.ts"], "ignore": ["src/**/*.spec.ts"], "exec": "ts-node ./app-server.ts" }y simplemente escribanodemon
Sandokan El Cojo
3
Cometí el error de agregar ./antes de los nombres de las carpetas y se rompió. Esto funcionó para mí: { "verbose": true, "watch": ["server/**/*.ts"], "ext": "ts js json", "ignore": ["server/**/*.spec.ts"], "exec": "ts-node index.ts" }. Y línea de comando:nodemon --watch server/**/*.ts --ignore server/**/*.spec.ts --verbose --exec ts-node index.ts
Adrian Moisa
2
Solo me gustaría mencionar que también debe configurarlo exten el archivo de configuración, por lo que su búsqueda de ts cambia. Mi archivo de configuración se ve así:{ "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

He abandonado nodemony estoy ts-nodea favor de una alternativa mucho mejor,ts-node-dev https://github.com/whitecolor/ts-node-dev

Solo corre ts-node-dev src/index.ts

Mikael Couzic
fuente
66
¿Y por qué es esto mejor?
Deilan
22
Es más rápido y detecta automáticamente qué archivos se deben ver, no se necesita configuración.
Mikael Couzic
44
Esta es la mejor opción (si no la única) para ts-node, especialmente para proyectos más grandes. No recompila todos los archivos desde cero, pero hace una compilación incremental, como tsc --watch.
Angelos Pikoulas
3
en mi caso, esto literalmente 10 veces más rápido que nodemoncon ts-node. ¡Gracias!
Florian
3
Así que literalmente solo tengo "start": "ts-node-dev src". No es necesario usar babel, nodemon ni ninguna de las configuraciones que vienen con él. Nosotros nos encargamos de todo por ti.
JMadelaine
53

Aquí hay una alternativa a la respuesta de HeberLZ , usando scripts npm.

Mi package.json:

  "scripts": {
    "watch": "nodemon -e ts -w ./src -x npm run watch:serve",
    "watch:serve": "ts-node --inspect src/index.ts"
  },
  • -e flag establece las extensiones a buscar,
  • -w establece el directorio observado
  • -x ejecuta el script

--inspecten el watch:servescript es en realidad un indicador node.js, solo habilita el protocolo de depuración.

im.pankratov
fuente
2
También asegúrese de tener mecanografiado instalado localmente para el proyecto. De lo contrario, el error que podría obtener no está muy claro.
Aranir
Creo que debería ser ts-node --inspect -- src/index.tsahora debido a esto .
bluenote10
1
Este enfoque parece generar una producción superflua considerable.
Freewalker
-e ts -w ./srchizo el truco para mí - esto funcionó con un proyecto loopback4 generado por CLI
Jonathan Cardoz
16

Específicamente para este problema, he creado la tsc-watchbiblioteca. Puedes encontrarlo en npm .

El caso de uso obvio sería:

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

gilamran
fuente
¿Cómo funcionaría esto en el caso de un servidor express o koa ya que en realidad no mata la instancia de nodo anterior?
Brianestey
'tsc-watch' mata y reinicia el proceso por usted.
gilamran
Esto es exactamente lo que estaba buscando. No estoy seguro de cuál es el propósito de ts-node-dev, pero no pude conseguir que informara errores mecanografiados. Después de pasar horas tratando de hacerlo funcionar, probé tsc-watch, ¡y funcionó de maravilla!
Charles Naccio
@gilamran en la documentación de su paquete hay un error tipográfico: "[...] similar to nodemon but for TypeCcript.":)
Massimiliano Kraus
13

Esto funciona para mi:

nodemon src/index.ts

Aparentemente gracias a desde esta solicitud de extracción: https://github.com/remy/nodemon/pull/1552

DLight
fuente
Esto también funciona para mí, pero ¿cómo? Parece un poco mágico. ¿Qué está compilando el mecanografiado? No tengo ts-nodeinstalado
d512
1
@ d512 ¿Estás seguro de que no está en tu node_modules/? Para mí falla si no lo tengo.
DLight
1
De hecho, esto requiere ts-nodeser instalado. Ejecutar este comando sin ts-nodegenerará un failed to start process, "ts-node" exec not founderror. Probablemente tenías esto como un artefacto sobrante node_modules. Dicho esto, esta solución es mucho mejor ya que no requiere configuración adicional.
Brandon Clapp
12

Añadir "watch": "nodemon --exec ts-node -- ./src/index.ts"a la scriptssección de su package.json.

takasoft
fuente
7

podrías usar ts-node-dev

Reinicia el proceso del nodo de destino cuando cualquiera de los archivos requeridos cambia (como nodo-dev estándar) pero comparte el proceso de compilación de Typecript entre reinicios.

Instalar en pc

yarn add ts-node-dev --dev

y tu package.json podría ser así

"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
fuente
¡Gracias! Esta fue la forma más fácil que encontré para habilitar la recarga automática con mi servidor de nodo.
Hisham Mubarak
7

lo hice con

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

e inicio de hilo ... ts-node no como 'ts-node'

wayan wahyu Adi Putra
fuente
1

Preferiría no usar ts-node y siempre ejecutar desde la carpeta dist.

Para hacer eso, solo configure su package.json con la configuración predeterminada:

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

y luego agregue el archivo de configuración nodemon.json :

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

Aquí, uso "exec": "npm restart"
para que todos los archivos ts se vuelvan a compilar en el archivo js y luego reinicien el servidor.

Para ejecutar en un entorno de desarrollo,

npm run dev

Usando esta configuración, siempre ejecutaré desde los archivos distribuidos y no necesito ts-node.

Raja PB
fuente
0

agregue esto a su archivo package.json

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

y para que esto funcione también necesita instalar ts-node como dependencia de desarrollo

yarn add ts-node -D

ejecutar yarn devpara iniciar el servidor de desarrollo

princebillyGK
fuente